【问题标题】:DynamoDB consistent read results in schema errorDynamoDB 一致性读取导致架构错误
【发布时间】:2015-10-24 20:26:52
【问题描述】:

我正在尝试使用 boto 从 python 与 DynamoDB 表进行交互。我希望所有读取/写入都保持仲裁一致性,以确保写入后立即发出的读取始终反映正确的数据。

注意:我的表设置为“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'}

这可能是由于过去请求失败导致某些隐藏数据损坏的结果吗? (例如以最终一致性执行的两个并发和不同的写入)

提前致谢。

【问题讨论】:

    标签: python amazon-dynamodb boto distributed


    【解决方案1】:

    看起来您正在调用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 结合使用。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 2016-05-26
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多