如何解决 AWS 上的最终一致性问题

How to tackle eventual consistency issues on AWS

我正在从事一个管理文档的项目(例如:创建、阅读、维护不同版本等...),我的计划是使用以下 AWS 架构。

当文档 created/updated 时,它将通过 API 网关 S3 代理保存到启用版本的 s3 存储桶中。 S3 put 事件将触发 lambda 以获取最新版本和所有版本 ID,并将其保存到 DynamoDB。一旦将其保存在 DynamoDB table 上,它将通过 DynamoDB 流在 Elasticsearch 中建立索引。

我的计划是对所有搜索查询使用 Elasticsearch。我将从 DynamoDB 加载最新文档。由于每条记录都有 S3 版本 ID,我也可以从 S3 查询旧版本。

由于我的架构在很大程度上依赖于最终一致性,即(S3 到 DynamoDB 和 DynamoDB 到 Elastic Search)我担心在创建一个数据库后查询 Elasticsearch 或查询 DynamoDB 时我不会获得最新的文档数据文档。

如有任何改进建议,我们将不胜感激。

谢谢!

正如您所说,您的应用程序架构有多个使用最终一致性的点。

如果您的应用程序业务案例绝对需要在查询数据时获得绝对最新版本,那么您的架构选择就很糟糕,您应该考虑使用 RDS 持久性等。

如果没有,那么您只需设计系统的其余部分,记住获得完整的 PUT 并不能保证立即查询 return 数据。提供有关如何执行此操作的说明在很大程度上取决于您的应用程序,并且不能一概而论。

由于您使用 dynamodb 流,您的 dynamodb 插入将到达您的弹性搜索服务器,但会有延迟。如果写入失败,则由客户端发出重试。 此外,您还必须记住触发 dynamodb 流所需的时间以及弹性搜索索引所需的时间(加上 s3 事件)。

所以你的问题与到达弹性搜索服务器所需的时间有关。

如果您想要更一致地描述当前状态(因为这是您最终会遇到的问题)而没有任何延迟,您需要更改工具。