Amazon web services amazons3条件put对象

Amazon web services amazons3条件put对象,amazon-web-services,amazon-s3,conditional,Amazon Web Services,Amazon S3,Conditional,我有一个系统,在这个系统中我收到了很多信息。每条消息都有一个唯一的ID,但它也可以在其生命周期内接收更新。由于消息发送和处理之间的时间可能很长(几周),因此它们存储在S3中。对于每条消息,只需要最新版本。我的问题是,偶尔会有两条相同id的消息同时到达,但它们有两个版本(旧版本和新版本) S3有没有一种方法可以有一个条件PutObject请求,在这里我可以声明“放置这个对象,除非我在S3中有一个更新的版本” 我需要一个原子能手术 这不是S3的用例,它最终是一致的。一些想法: 您可以尝试对邮件进行

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

S3有没有一种方法可以有一个条件PutObject请求,在这里我可以声明“放置这个对象,除非我在S3中有一个更新的版本”

我需要一个原子能手术

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

  • 您可以尝试对邮件进行分区—所有以A-L开头的邮件都会转到一个方框,M-Z会转到另一个方框。然后,每个框本地检查是否没有重复项

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

  • 有一种方法可以为每个项目创建唯一的处理队列,但这可能意味着更多的HTTP请求,而不仅仅是签入S3

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


使用标签,并在使用PutObject时使用一个条件,难道不能解决这个问题吗?请参见此处的“示例3:允许用户添加包含特定标记键和值的对象标记:

您将如何识别哪个标记较新或较旧?您可以插入一个存储时间戳信息的自定义标头,然后检查它是否较旧/较新。我使用嵌入在每条消息中的时间戳。在每个请求上检查S3都会影响性能,并且不能解决竞争条件。这里我需要一个原子操作。s3似乎不支持您的用例。您可能无法获得的最后结果是版本控制,这意味着两个版本都将被存储。您必须在请求时确定哪个版本实际上是最新的。如果您的对象在大小限制范围内,类似SimpleDB的东西可能会起作用。