如何解决在对象更新时读取
我正在编写一个读写DynamoDB的api。我担心一个问题,假设我有一个表格和该表格中的一个项目,如下所示:
’’’ { “ id”:123, “状态”:“未批准”, “信息”:“一些文字” } ’’
一个用户正在更新状态,另一个用户正在尝试同时读取状态,一个或两个任务都会失败吗?而且,如果一个正在更新状态而另一个正在请求信息怎么办?
DynamoDB是否可以处理此类情况,还是我需要想出一种方法来“锁定”该项目并使所有其他任务等到写入完成?
流程是; 前端-> API网关-> lambda API 相同的Lambda既可以完成两项任务,又可以分别触发2次
解决方法
根据需要,可以使用最终一致性或强一致性: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html
默认情况下,AWS开发工具包使用最终一致性。您必须设置ConsistentRead参数以使用强一致性。
注意事项:
- 强一致性要慢一些(它必须等待任何冲突的操作才能确保返回的结果绝对是请求时的准确值100%)
- 高度一致的读取也更昂贵,因为它们消耗更多的吞吐量
在大多数情况下,应将应用程序设计为在写入后接受并非100%准确的读取,因为这仅需要几微秒/毫秒即可使数据最终保持一致。例如,您可以在编写新项目时乐观地返回它(“我有信心这就是数据库在几毫秒内的样子”),并考虑到应用程序中此数据可能错误/不正确/过时的情况,这样您就不必再次从数据库中读取它了(而且,这样做的过程既昂贵又缓慢,没有充分的理由,所以不必这样做)。但是,当您确实确实需要确保您正在读取准确,更新的数据时,请使用强一致性。有一个很好的理由,尽管它不是默认值。
一个用户正在更新状态,另一个用户正在尝试同时读取状态,一个或两个任务都会失败吗?
否,读操作只是可能会或可能不会返回过时的数据。
如果一个正在更新状态而另一个正在请求状态怎么办? 信息吗?
读取可能具有新值或旧值,具体取决于读取的同时性。但是基本上,用户机器与数据库之间的网络延迟所花费的时间通常通常足以使最终/强烈的一致性变得无关紧要。如果您的应用程序对竞争条件敏感,或者必须100%确保写入数据在写入后1微秒内与写入数据相同,请使用强一致性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。