【发布时间】:2021-01-05 22:00:37
【问题描述】:
当 DynamoDB 客户端对某个项目调用 DeleteItem 时,它可以使用ReturnItems 请求参数在响应中获知该项目的预删除内容:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html#DDB-DeleteItem-request-ReturnValues
当 2 个或多个客户端同时删除同一个项目时,他们是否可以使用此参数来确定他们中的哪个真正删除了该项目,从而哪些客户端拨打了不是 严格必要?换句话说,使用此参数,只有一个客户端会在 DeleteItem 响应中看到项目的内容,而所有其他客户端将看到不包含项目内容的响应——允许他们正确推断出他们没有实质性删除项目?
我相信众所周知,在正常操作中,写入 DynamoDB 需要来自分区中 3 个存储节点中的 2 个的确认。我找不到任何正式或其他形式的文档,其中提到了删除的等效保证;虽然我当然可以明白为什么会是一样的。
鉴于提到更新被视为先删除然后是放置(https://en.wikipedia.org/wiki/Amazon_DynamoDB#Query_execution:“当日志传播器接收到更新操作时,它会向所有索引发出删除操作和放置操作”),我会很高兴地相信删除字面上被视为与写入相同的基本保证。
如果删除确实需要来自 3 个存储节点中的 2 个的确认,那么在重大系统故障情况之外,我认为我可以安全地使用 ReturnItems 请求参数来确定实际是哪个客户端设法删除了一个项目。在正常操作或过载且缓慢但未失败的存储节点操作中,是否有任何东西使该假设无效?为了争论,我明确没有考虑“DynamoDB 在 $REGION 模式下关闭”...
[我的用例是作为一种协调机制,客户端应该处理刚刚删除的特定项目;因此我不认为在删除后不一致读取等方面存在任何问题。]
【问题讨论】:
标签: amazon-web-services amazon-dynamodb