在更新对象时读取对象
Reading from an object while it’s being updated
我正在编写一个 api 来读取和写入 DynamoDB。我有一个顾虑,假设我有一个 table 和那个 table 中的一个项目,看起来像:
'''
{
“编号”:123,
“状态”:“未批准”,
“信息”:“一些文字”
}
’’’
一个用户正在更新状态,而另一个用户正在尝试同时读取它,一个或两个任务会失败吗?如果一个正在更新状态而另一个正在请求信息怎么办?
DynamoDB 是否处理此类情况,或者我是否需要想出一种方法来“锁定”该项目并让所有其他任务等到写入完成?
流量是;
前端-> api 网关-> lambda api
同一个 lambda 执行两个任务并分别触发 2 次
根据你的需要,你可以使用最终一致性或强一致性:
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html
默认情况下,AWS SDK 使用最终一致性。您必须设置 ConsistentRead 参数才能使用强一致性。
注意事项:
- 强一致性有点慢(它必须等待任何冲突操作以确保 returned 的结果是绝对的,100%,请求时的准确值)
- 强一致性读取也更昂贵,因为它们消耗更多吞吐量
在大多数情况下,您应该将您的应用程序设计为接受写入后并非 100% 准确的读取,因为这应该只需要几次 microseconds/milliseconds 就可以使您的数据最终保持一致。例如,您可以在编写新项目时乐观地return(“我相信这就是数据库在几毫秒后的样子”)并可能考虑到这一点wrong/inaccurate/outdated应用程序中的数据,这样您就不必再次从数据库中读取它)(而且,这样做既昂贵又缓慢,没有充分的理由,所以不要这样做)。但是当你真的、真的、真的需要确保你读取的是准确的、更新的数据时,使用强一致性。不过,它不是默认值是有充分理由的。
One user is updating the status, and another is trying to read it simultaneously, will one or both tasks fail?
不,读取操作只是可能会也可能不会 return 过时的数据。
And what if one is updating the status and the other is requesting the
info?
Read 可能具有新值或旧值,具体取决于同时发生的精确程度。但基本上,仅用户计算机和数据库之间的网络延迟所花费的时间通常就足以让 eventual/strong 一致性变得无关紧要。如果你的应用对竞争条件敏感或者必须100%保证读数据和写数据在写入1微秒后是一样的,使用强一致性。
我正在编写一个 api 来读取和写入 DynamoDB。我有一个顾虑,假设我有一个 table 和那个 table 中的一个项目,看起来像:
''' { “编号”:123, “状态”:“未批准”, “信息”:“一些文字” } ’’’
一个用户正在更新状态,而另一个用户正在尝试同时读取它,一个或两个任务会失败吗?如果一个正在更新状态而另一个正在请求信息怎么办?
DynamoDB 是否处理此类情况,或者我是否需要想出一种方法来“锁定”该项目并让所有其他任务等到写入完成?
流量是; 前端-> api 网关-> lambda api 同一个 lambda 执行两个任务并分别触发 2 次
根据你的需要,你可以使用最终一致性或强一致性: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html
默认情况下,AWS SDK 使用最终一致性。您必须设置 ConsistentRead 参数才能使用强一致性。
注意事项:
- 强一致性有点慢(它必须等待任何冲突操作以确保 returned 的结果是绝对的,100%,请求时的准确值)
- 强一致性读取也更昂贵,因为它们消耗更多吞吐量
在大多数情况下,您应该将您的应用程序设计为接受写入后并非 100% 准确的读取,因为这应该只需要几次 microseconds/milliseconds 就可以使您的数据最终保持一致。例如,您可以在编写新项目时乐观地return(“我相信这就是数据库在几毫秒后的样子”)并可能考虑到这一点wrong/inaccurate/outdated应用程序中的数据,这样您就不必再次从数据库中读取它)(而且,这样做既昂贵又缓慢,没有充分的理由,所以不要这样做)。但是当你真的、真的、真的需要确保你读取的是准确的、更新的数据时,使用强一致性。不过,它不是默认值是有充分理由的。
One user is updating the status, and another is trying to read it simultaneously, will one or both tasks fail?
不,读取操作只是可能会也可能不会 return 过时的数据。
And what if one is updating the status and the other is requesting the info?
Read 可能具有新值或旧值,具体取决于同时发生的精确程度。但基本上,仅用户计算机和数据库之间的网络延迟所花费的时间通常就足以让 eventual/strong 一致性变得无关紧要。如果你的应用对竞争条件敏感或者必须100%保证读数据和写数据在写入1微秒后是一样的,使用强一致性。