锁定s3对象的最佳做法?

Tod*_*odd 6 amazon-s3 amazon-ec2 amazon-web-services

我有一个S3存储桶,其中包含多个可以从中拉出的S3对象(水平缩放时).每个EC2将一次拉出一个对象,对其进行处理,然后将其移动到另一个桶中.

目前,为了确保多个EC2实例不处理相同的对象,我的Java应用程序将其重命名为添加到其S3对象键的"锁定"扩展名.问题是"重命名"实际上是在做"移动".因此,S3存储桶中的大文件可能需要几分钟才能完成"重命名",从而导致锁定过程无效.

有没有人有最佳实践来完成我想要做的事情?

我考虑使用SQS,但是"解决方案"有其自身的一系列问题(订单无法保证,消息可能不止一次传送,并且多个EC2获得相同的消息)

我想知道设置一个"锁定"标题是否会更快"锁定"过程.

Mic*_*bot 8

订单无法保证,消息传递的可能性不止一次,并且多个EC2获得相同的消息

实际获得同一消息不止一次的几率很低.它只是"可能",但不太可能.如果在孤立的情况下,如果你碰巧不止一次处理一个文件,那么它本质上只是一个烦恼,那么SQS似乎是一个完全合理的选择.

否则,您将需要一个外部机制.

在对象上设置"锁定"标题有一个问题 - 当你用自己的副本覆盖一个对象时(这就是你改变元数据时会发生的事情) - 创建一个新的对象副本,同样的键)然后你受制于最终一致性的吊索和箭头.

问:Amazon S3采用什么数据一致性模型?

所有Regions中的Amazon S3存储桶都为新对象的PUTS提供了读写后一致性,并为覆盖PUTS和DELETES提供了最终一致性.

https://aws.amazon.com/s3/faqs/

更新元数据是"覆盖" PUT.您的新标题可能不会立即显示,如果两个或多个工作人员设置了自己的唯一标题(例如x-amz-meta-locked:i-12345678),则完全有可能出现如下情况(W1,W2) =工人#1和#2):

W1: HEAD object (no lock header seen)
W2: HEAD object (no lock header seen)
W1: set header
W2: set header
W1: HEAD object (sees its own lock header)
W2: HEAD object (sees its own lock header)
Run Code Online (Sandbox Code Playgroud)

在几种不同的定时排列中可能发生相同或类似的故障.

在这样的最终一致性环境中,对象无法有效锁定.

  • TLDR:你需要一个数据库来做数据库事务. (6认同)
  • 弹性文件系统应该更好地工作.它不是S3的前端,它立即是一致的,它支持实际的NFS锁定......但它目前仍在预览中,仅在us-west-2(Oregon)中可用. (3认同)

Tej*_*mar 6

对象标签在这里可以提供帮助,因为更改标签不会创建新副本。标签是一种与对象关联的键/值对。即您需要使用对象级标记。

  • 感谢 Tejas,这是一个绝妙的解决方案! (2认同)