2011-12-29 86 views
14

可能重复:
Notification of new S3 objects用户上传到S3存储桶时会收到通知吗?

我们已经找到存储在S3上的用户数据的应用程序。处理上传的应用程序部分与处理数据的部分分离。在某些情况下,用户可以直接将数据上传到S3,而无需通过我们的应用程序(如果他们拥有自己的S3帐户并向我们提供凭据,则可能会发生这种情况)。

是否有可能得到通知每当S3存储的内容发生变化?这将是很酷,如果不知何故消息可能会发送说,“这个文件被添加/更新/删除:富”。

简短的是,有一些地方戳我可以轮询会告诉上次桶被更新?

如果我不能做任何的这些东西,那么唯一的选择是抓取整个桶和寻找变化。这将是缓慢和昂贵的。

回答

17

更新2014-11:

正如艾伦解毒,阿莫西林在评论中指出,AWS现在支持从S3到SNS通知,这是可以自动转发到SQS:http://aws.amazon.com/blogs/aws/s3-event-notification/

S3也可以发送通知AWS Lambda直接运行您自己的代码。

该预测S3-> SNS通知原始响应:

如果亚马逊支持这一点,他们会使用SNS来发送一个对象已被添加到一个桶通知。然而,此刻,通过S3和SNS支持的唯一斗事件时通知您的Amazon S3检测到它已经失去了精简冗余存储(RRS)对象的所有副本,并可以为对象不再服务请求。

这里是由S3支持的SNS事件的文档:

http://docs.amazonwebservices.com/AmazonS3/latest/dev/NotificationHowTo.html

根据该文件写入的方式,它看起来像亚马逊拥有其他通知事件添加的想法(也许你想知道何时添加新的密钥)。

由于它不是由亚马逊S3的客户端上传对象S3将需要触发通知,或者你需要做一些投票站的直接支持。

上传到S3的自定义事件通知可以使用SNS完成,如果您希望获得近乎实时的处理更新,或者可以通过SQS完成,如果您想让通知堆积并处理它们按自己的步调排队。

如果你是轮询,可以减少你需要具有的,比如说一个前缀,客户端上传请求键的数量“未处理/ ......”后面的唯一关键。您的轮询软件可以查询以该前缀开头的S3密钥。当它准备好处理时,它可以将密钥更改为“处理/ ...”,然后再更改为“处理/ ...”或其他。 S3中的对象目前通过S3执行的复制+删除操作进行重命名。

+0

对于体积较小的对象,名称的前缀将正常工作。对于大量的物体,这实际上会减慢S3。 S3根据存储桶名称/对象密钥对数据进行内部分区,而具有相同前缀的密钥很可能最终位于同一分区中。要获得较高的上传吞吐量,您需要在字符串的开始处更改对象键。有关详细信息,请参阅以下内容:http://aws.typepad.com/aws/2012/03/amazon-s3-performance-tips-tricks-seattle-hiring-event.html – dlaidlaw 2013-05-16 14:08:20

+0

@dlaidlaw:正如亚马逊描述的那样,它很容易即使没有特殊的密钥前缀分配,也可以处理每秒超过100个请求的突发。如果您比以前更快地处理入站队列,则可以简单地使用“未处理”存储区而不是前缀。但是,以这种速度,你很可能会使用并行处理器,在这一点上,有一个被轮询的单个未处理文件列表的建议被破坏了(你怎么知道哪个线程正在处理哪个文件?)。 – 2013-05-17 01:28:32

+4

对于吞吐量非常高的情况,我在S3中向包含该文件URI的SQS写入消息。然后多个线程可以处理SQS队列。是的,在编写SQS消息时会有开销,但它是必需的,并分布在所有线程发送文件到S3。它会好得多,如果亚马逊有一个标志派在S3,然后你可以订阅的SQS队列分发跨线程负载创建一个SNS的消息,但在那之前,你必须写自己的消息要么SNS或SQS。 – dlaidlaw 2013-06-03 15:47:42

相关问题