如果我将文件流式传输到 s3,文件完成后事件会触发吗?
If I stream a file to s3, will the event trigger once the file is complete?
如标题所述,如果我将事件附加到 S3 存储桶以进行放置事件并将文件流式传输到该存储桶,上传开始后事件是否会触发?这样接收方就可以开始下载该文件的流。
还是文件上传完成后触发?
你考虑的有两个问题:
上传完成后事件才会触发。
将对象写入 S3 始终是原子操作。写入要么成功完成,要么根本没有发生...在成功完成之前,对象实际上并不存在于存储桶中。
如果您要将新对象写入存储桶,对该对象的授权请求将return 404 错误至少,直到上传成功完成。
如果您要覆盖现有对象,对该对象的授权请求将始终return该对象的旧副本,未更改且未损坏,至少直到覆盖成功完成。
注意上面"at least until,"的用法。
在所有地区,除美国标准 (us-east-1) 外,新对象的上传通常在上传后立即可用。 在 US-Standard 中,有时可能会有短暂的延迟。 以前是 S3 的 us-east-1 区域(弗吉尼亚北部,之前指定为 "US Standard" 区域)没有为新对象提供即时(写后读)一致性,但现在可以了。
但是,有一个问题:对象在上传之前不能被请求。如果是,一致性模型就会崩溃。¹
Amazon S3 provides read-after-write consistency for PUTS of new objects in your S3 bucket in all regions with one caveat. The caveat is that if you make a HEAD or GET request to the key name (to find if the object exists) before creating the object, Amazon S3 provides eventual consistency for read-after-write.
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#Regions
在所有地区,现有对象的覆盖也可能会遇到短暂的延迟(删除对象在删除后可能会在短时间内保持可访问状态)。
这个潜在 延迟是由于 S3 在某些操作上的最终一致性模型,如上所述。 S3 不保证所有操作都会立即可见,但出于实际目的,它们几乎总是可见。 S3 保证的是,如果您的上传成功完成,S3 成功响应,那么您的对象 是 提交到 S3 后备存储。
以上适用于 PUT
上传、PUT/Copy 和多部分。
由于这些原因,S3 无法在上传尚未完成时将您的文件流式传输给消费者。
要做到这一点需要不同的解决方案(尽管 S3 当然可以在流式传输完成后用作永久存储库)。
¹一致性模型被破坏。几乎可以肯定,这表明到达 S3 的请求会查询存储桶索引的副本,如果该索引不知道是否有一个对象存在,它会参考更权威的索引版本。如果它仍然什么也没找到,它会在本地 "remembers" 该对象不存在,因为上游查找是一个相对昂贵的操作——因此它不会在后续请求中再次向上游查找——但是一旦创建了新对象传播到本地索引中,该对象将可用。同样的理论解释了覆盖和删除的最终一致性。
如标题所述,如果我将事件附加到 S3 存储桶以进行放置事件并将文件流式传输到该存储桶,上传开始后事件是否会触发?这样接收方就可以开始下载该文件的流。
还是文件上传完成后触发?
你考虑的有两个问题:
上传完成后事件才会触发。
将对象写入 S3 始终是原子操作。写入要么成功完成,要么根本没有发生...在成功完成之前,对象实际上并不存在于存储桶中。
如果您要将新对象写入存储桶,对该对象的授权请求将return 404 错误至少,直到上传成功完成。
如果您要覆盖现有对象,对该对象的授权请求将始终return该对象的旧副本,未更改且未损坏,至少直到覆盖成功完成。
注意上面"at least until,"的用法。
在所有地区,除美国标准 (us-east-1) 外,新对象的上传通常在上传后立即可用。 在 US-Standard 中,有时可能会有短暂的延迟。 以前是 S3 的 us-east-1 区域(弗吉尼亚北部,之前指定为 "US Standard" 区域)没有为新对象提供即时(写后读)一致性,但现在可以了。
但是,有一个问题:对象在上传之前不能被请求。如果是,一致性模型就会崩溃。¹
Amazon S3 provides read-after-write consistency for PUTS of new objects in your S3 bucket in all regions with one caveat. The caveat is that if you make a HEAD or GET request to the key name (to find if the object exists) before creating the object, Amazon S3 provides eventual consistency for read-after-write.
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#Regions
在所有地区,现有对象的覆盖也可能会遇到短暂的延迟(删除对象在删除后可能会在短时间内保持可访问状态)。
这个潜在 延迟是由于 S3 在某些操作上的最终一致性模型,如上所述。 S3 不保证所有操作都会立即可见,但出于实际目的,它们几乎总是可见。 S3 保证的是,如果您的上传成功完成,S3 成功响应,那么您的对象 是 提交到 S3 后备存储。
以上适用于 PUT
上传、PUT/Copy 和多部分。
由于这些原因,S3 无法在上传尚未完成时将您的文件流式传输给消费者。
要做到这一点需要不同的解决方案(尽管 S3 当然可以在流式传输完成后用作永久存储库)。
¹一致性模型被破坏。几乎可以肯定,这表明到达 S3 的请求会查询存储桶索引的副本,如果该索引不知道是否有一个对象存在,它会参考更权威的索引版本。如果它仍然什么也没找到,它会在本地 "remembers" 该对象不存在,因为上游查找是一个相对昂贵的操作——因此它不会在后续请求中再次向上游查找——但是一旦创建了新对象传播到本地索引中,该对象将可用。同样的理论解释了覆盖和删除的最终一致性。