DynamoDB 一致性读取导致架构错误
DynamoDB consistent read results in schema error
我正在尝试使用 boto 与来自 python 的 DynamoDB table 进行交互。我希望所有 reads/writes 都具有仲裁一致性,以确保在写入后立即发送的读取始终反映正确的数据。
注意:我的 table 设置为 "phone_number" 作为哈希键,first_name+last_name 作为二级索引。出于这个问题的目的,数据库中存在一个(且只有一个)项目(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'}
这可能是由于过去请求失败导致某些隐藏数据损坏的结果吗? (例如以最终一致性执行的两个并发和不同的写入)
提前致谢。
您似乎在调用 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 没有提供关于 "eventually consistent" 是什么样子的具体指标,但在日常使用中,即使最终一致读取,也能在一秒内读出仅 written/modified 的记录是正常的.
至于对同一个对象同时进行多次写入,DynamoDB的写入总是强一致的。如果您担心同时修改单个项目会导致意外行为导致写入失败,并且您的应用程序逻辑无法处理出现的任何问题,则可以将 conditional writes 与 DynamoDB 结合使用。
我正在尝试使用 boto 与来自 python 的 DynamoDB table 进行交互。我希望所有 reads/writes 都具有仲裁一致性,以确保在写入后立即发送的读取始终反映正确的数据。
注意:我的 table 设置为 "phone_number" 作为哈希键,first_name+last_name 作为二级索引。出于这个问题的目的,数据库中存在一个(且只有一个)项目(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'}
这可能是由于过去请求失败导致某些隐藏数据损坏的结果吗? (例如以最终一致性执行的两个并发和不同的写入)
提前致谢。
您似乎在调用 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 没有提供关于 "eventually consistent" 是什么样子的具体指标,但在日常使用中,即使最终一致读取,也能在一秒内读出仅 written/modified 的记录是正常的.
至于对同一个对象同时进行多次写入,DynamoDB的写入总是强一致的。如果您担心同时修改单个项目会导致意外行为导致写入失败,并且您的应用程序逻辑无法处理出现的任何问题,则可以将 conditional writes 与 DynamoDB 结合使用。