Amazon S3 条件放置对象

Dav*_*itz 6 conditional amazon-s3 amazon-web-services

我有一个系统,可以在其中收到很多消息。每条消息都有一个唯一的 ID,但它也可以在其生命周期内接收更新。由于消息发送和处理之间的时间可能很长(数周),因此它们存储在 S3 中。对于每条消息,只需要最后一个版本。我的问题是,有时同一 id 的两条消息会一起到达,但它们有两个版本(旧的和新的)。

有没有办法让 S3 有一个有条件的 PutObject 请求,我可以在其中声明“除非我在 S3 中有更新版本,否则放置这个对象”?

Bra*_*ncy 5

我这里需要一个原子操作

这不是 S3 的用例,S3 是最终一致的。一些想法:

  • 您可以尝试对消息进行分区 - 所有以 AL 开头的消息都会发送到一个盒子,MZ 会发送到另一个盒子。然后每个框在本地检查是否没有重复项。

  • 您最好的选择可能是某种数据库。根据您的使用案例,您可以使用常规 SQL 数据库,也可以使用简单的仅 RAM 数据库(例如 Redis)。一次写入多个 Redis 数据库以避免 SPOF。

  • SWF可以为每个项目创建一个唯一的处理队列,但这可能意味着比仅在 S3 中签入更多的 HTTP 请求。

  • David 关于打开版本控制的想法很有趣。您可以有一个守护进程来定期删除旧版本。阅读时,您必须执行“读取修复”,在其中搜索版本以​​查找最新对象。

  • 这与最终一致性无关。问题是 S3 不支持 PUT 请求的 If-Unmodified-Since 或 If-Match 请求。令人惊讶的是,这些都支持 GET 请求。请参阅 https://s3.amazonaws.com/doc/s3-developer-guide/RESTObjectPUT.html 和 https://s3.amazonaws.com/doc/s3-developer-guide/RESTObjectGET.html (3认同)
  • 在 2022 年底,尽管 S3 现在具有很强的一致性,但它仍然不支持 Check-And-Set 风格的操作,这仍然是事实。 (2认同)