我有一个系统,可以在其中收到很多消息。每条消息都有一个唯一的 ID,但它也可以在其生命周期内接收更新。由于消息发送和处理之间的时间可能很长(数周),因此它们存储在 S3 中。对于每条消息,只需要最后一个版本。我的问题是,有时两条具有相同 id 的消息会同时到达,但它们有两个版本(旧版本和新版本)。
S3 有没有办法有一个条件 PutObject 请求,我可以在其中声明“除非我在 S3 中有更新版本,否则放置此对象”?
我这里需要一个原子操作
这不是 S3 的用例,S3 是最终一致的。一些想法:
您可以尝试对消息进行分区 - 所有以 A-L 开头的消息都会进入一个盒子,M-Z 则会进入另一个盒子。然后每个框在本地检查是否没有重复项。
您最好的选择可能是某种数据库。根据您的用例,您可以使用常规 SQL 数据库,也可以使用简单的仅 RAM 数据库(如 Redis)。 一次写入多个Redis DB以避免SPOF。
有 SWF 可以为每个项目创建一个唯一的处理队列,但这可能意味着比仅仅签入 S3 更多的 HTTP 请求。
David 关于打开版本控制的想法很有趣。您可以有一个守护进程来定期删除旧版本。 阅读时,您必须进行“读修复”,在其中搜索版本以查找最新的对象。
难道不能通过使用标签并在使用 PutObject 时使用条件来解决这个问题吗?请参阅此处的“示例 3:允许用户添加包含特定标签键和值的对象标签”:https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html#tagging-和-政策
其他答案已过时。
S3 现在支持条件写入:https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-s3-conditional-writes/