在更新某些项目时扫描 DynamoDb

Scanning DynamoDb while updating some items

当我在 DynamoDb 上 运行 扫描操作时,我可以使用 LastEvaluatedKey 即 returned 作为响应的一部分来扫描下一个可用的项目。我可以重复这个过程,直到它不再 return LastEvaluatedKey 并且表明没有更多项目要扫描。

我的问题是,如果在该扫描操作的中间,从扫描过程中检索到的一些项目被更新(放置),我应该期望这些项目再次出现吗?

否 - 如果您已经检索到一个项目,即使它被修改,您也不会在同一个 Scan 操作中再次检索它。此外,如果您的修改添加了 new 项,则正在进行的扫描可能会或可能不会返回此新项 - 您不知道。

要理解为什么会这样,您需要了解 Scan 的实际工作原理:

尽管 DynamoDB 不保证分区键之间的任何排序顺序,但在其内部实现中,此分区键有一些顺序(基于键的哈希函数 - 这就是为什么这些键在一些 DynamoDB 文档作为 哈希键 )。 Scan 以此哈希顺序遍历分区键,并且不会返回。如果扫描通过了哈希值中的某个位置,则不会再次通过,特别是不会再次检索具有相同分区键的相同项目,并且是否会检索新项目取决于是否新项目的分区键在当前扫描位置之前或之后。

如果您确实需要在所有新修改发生时立即获取它们,您应该考虑使用 DynamoDB 的 "Stream" 功能而不是 - 或者除 - Scan 之外。 DynamoDB 的 Stream 功能让您可以读取对数据库的所有修改。一些应用程序结合了 Scan 来读取现有项目,并结合了流来读取扫描开始后修改的项目。