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