锁定s3对象的最佳做法?

时间:2015-10-26 14:12:03

标签: amazon-web-services amazon-s3 amazon-ec2

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

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

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

我考虑过使用SQS,但那"解决方案"有自己的一系列问题(订单不保证,消息传递的可能性不止一次,以及多个EC2获得相同的消息)

我想知道是否设置了#34;锁定"标题会更快"锁定"处理。

4 个答案:

答案 0 :(得分: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)

几种不同的时间排列可能会发生相同或类似的失败。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您是否考虑过将FIFO队列用于用例。 FIFO队列维护消息从发送到队列到轮询消息的顺序,而不是尽力而为的排序。您还可以确保对象仅处理一次,因为重复数据删除允许只处理一次。

答案 3 :(得分:0)

S3 一致性模型已经改变。现在它支持新对象和对象覆盖的强写后读一致性。 https://aws.amazon.com/s3/faqs/

<块引用>

成功写入新对象或覆盖现有对象后, 任何后续读取请求都会立即收到该对象的最新版本。