我正在尝试使用boto从python与DynamoDB表进行交互。我希望所有读/写都具有仲裁一致性,以确保在写入后立即发送的读取始终反映正确的数据。
注意:我的表设置为使用“phone_number”作为散列键,first_name + last_name作为辅助索引。并且出于此问题的目的,db(first_name =“Paranoid”,last_name =“Android”,phone_number =“42”)中存在一个(且仅一个)项目。
以下代码按预期工作:
customer = customers.get_item(phone_number="42")
虽然这句话:
customer = customers.get_item(phone_number="42", consistent_read=True)
因以下错误而失败:
boto.dynamodb2.exceptions.ValidationException: ValidationException: 400 Bad Request
{u'message': u'The provided key element does not match the schema', u'__type': u'com.amazon.coral.validate#ValidationException'}
这可能是由于过去请求失败导致的一些隐藏数据损坏的结果吗? (例如,在最终一致性时执行的两个并发和不同的写入)
提前致谢。
答案 0 :(得分:2)
看起来您正在调用get_item方法,因此问题在于如何传递参数。
get_item(hash_key, range_key=None, attributes_to_get=None, consistent_read=False, item_class=<class 'boto.dynamodb.item.Item'>)
这意味着您应该调用API,如:
customer = customers.get_item(hash_key="42", consistent_read=True)
我不确定你原来打电话的原因是什么。
为了解决您对数据损坏和最终一致性的担忧,与您对DynamoDB进行的任何API调用都可能导致它在您向项目发送错误数据之外进入错误状态。 DynamoDB是一种经过高度测试的解决方案,可提供出色的可用性,并可以非常长的时间来处理您发送的数据。
使用DynamoDB可以了解最终的一致性,但一般来说,根据用例的具体情况,它不会导致许多问题。虽然AWS没有提供关于“最终一致”外观的具体指标,但在日常使用中,即使在最终一致读取时,能够读出刚刚写入/修改的记录也是正常的。
对于在同一对象上同时执行多次写入,DynamoDB写入始终非常一致。如果您担心同时修改单个项目会导致意外行为导致写入失败并且您的应用程序逻辑可以处理出现的任何问题,则可以将conditional writes用于DynamoDB。