想象一下,将文件上传到 Amazon S3,成功后文件(和元数据)的位置存储在 ElasticSearch 的记录中。好没问题。
但是,如果其中一个请求失败,您如何确保数据一致性(ACID?)......例如,如果 ElasticSearch 服务不可用
- 必须删除 S3 上的文件
- 但是如果 S3 上的删除失败怎么办
这将导致不一致的状态。
所以问题是如何让这些实例保持同步?
想法是:
- 如果状态不一致并且用户请求 ElasticSearch 记录但没有找到任何内容,则删除 S3 中的记录。(嗯)
- 批处理作业以搜索数据库中的不一致并删除它们。
- 在数据库中的事务中运行两个请求,如果一个失败 -> 回滚并稍后重试(队列,作业 = Overkill?)