1

想象一下,将文件上传到 Amazon S3,成功后文件(和元数据)的位置存储在 ElasticSearch 的记录中。好没问题。

但是,如果其中一个请求失败,您如何确保数据一致性(ACID?)......例如,如果 ElasticSearch 服务不可用

  • 必须删除 S3 上的文件
  • 但是如果 S3 上的删除失败怎么办

这将导致不一致的状态。

所以问题是如何让这些实例保持同步?

想法是:

  • 如果状态不一致并且用户请求 ElasticSearch 记录但没有找到任何内容,则删除 S3 中的记录。(嗯)
  • 批处理作业以搜索数据库中的不一致并删除它们。
  • 在数据库中的事务中运行两个请求,如果一个失败 -> 回滚并稍后重试(队列,作业 = Overkill?)
4

1 回答 1

0

在这种情况下 ACID 是不可能的,因为您正在使用最终一致的系统。

您的第三个建议是最接近最佳实践的。

该系统的参考架构是将对象写入 AWS S3,然后使用 S3 Bucket 通知到 AWS Lambda 执行对 Elasticsearch 的写入。如果在来自 S3->Lambda->Elasticsearch 的通知阶段写入失败,请使用死信 SQS 队列收集损坏的作业,然后使用 CloudWatch Events->Lambda 按照定时计划定期刷新队列。

于 2016-08-19T23:40:18.793 回答