As title says, if I attached an event to an S3 bucket for put events and I stream a file to that bucket, will the event trigger once the upload starts? That way a receiver can start downloading stream for that file.
Or will the event be triggered after the file has been completed uploading?
答案 0 :(得分:4)
您正在考虑的问题有两个问题:
在上传完成之前,事件不会触发。
将对象写入S3始终是原子操作。写入要么成功完成,要么根本不会发生......并且在成功完成之前,该对象实际上不存在于存储桶中。
如果要将新对象写入存储桶,则对该对象的授权请求将至少返回404错误,直到上传成功完成。
如果要覆盖现有对象,对该对象的授权请求将始终返回该对象的旧副本,未更改且未损坏,至少,直到覆盖完成为止成功。
注意上面使用“至少直到”。
在所有地区,除了US-Standard(us-east-1)之外,通常在上传后立即上传新对象。 在美国标准中,有时可能会有短暂的延迟。以前,S3(北弗吉尼亚州,以前被称为“美国标准”地区)的us-east-1地区不能立即提供新的对象的(read-after-write)一致性,但现在确实如此。
然而,有一个问题:在上传之前不得要求该对象。如果是,则一致性模型会破坏.¹
Amazon S3为所有地区的S3存储桶中的新对象的PUTS提供了读写后一致性,但有一点需要注意。需要注意的是,如果您在创建对象之前对密钥名称发出HEAD或GET请求(以查找对象是否存在),则Amazon S3会为写入后写入提供最终一致性。
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#Regions
在所有地区,现有对象的覆盖也可能会遇到短暂的延迟(删除后删除对象可能会在短时间内无法访问)。
此潜在延迟是由于S3在某些操作上的最终一致性模型,如上所述。 S3并不保证所有操作都会立即可见,但实际上,它们几乎总是如此。 S3 做保证的是,如果您的上传成功完成,并且S3成功响应,那么您的对象 将提交给S3后备存储。
以上内容适用于PUT
上传,PUT /复制和多部分。
由于这些原因,在上传尚未完成时,S3无法将文件流式传输给消费者。
要做到这一点需要一个不同的解决方案(尽管S3可以在流式传输完成后用作永久存储库)。
¹一致性模型中断。几乎可以肯定,这表明到达S3的请求参考了bucket索引的副本,如果索引不知道对象是否存在,它会咨询一个更权威的索引版本。如果它仍然没有找到任何东西,它会在本地“记住”该对象不存在,因为上游查找是一个相对昂贵的操作 - 因此它不会在后续请求中再次查找上游 - 但是一旦创建新的对象传播到本地索引,该对象将可用。同样的理论解释了覆盖和删除的最终一致性。