如果我将文件流传输到s3,则文件完成后是否会触发事件?

iCo*_*unk 4 streaming amazon-s3 amazon-sqs

如标题所述,如果我将事件附加到用于放置事件的S3存储桶中,并且将文件流式传输到该存储桶,那么一旦开始上传,事件将触发吗?这样,接收者可以开始下载该文件的流。

还是在文件上传完成后触发事件?

Mic*_*bot 5

您要考虑的问题有两个:

  • 在上传完成之前,该事件不会触发。

  • 将对象写入S3始终是原子操作。写入要么成功完成,要么根本不发生……直到成功完成,该对象实际上并不存在于存储桶中。

如果您要将新对象写入存储桶中,则对该对象的授权请求将至少返回404错误直到上传成功完成。

如果要覆盖现有对象,则对该对象的授权请求将始终返回该对象的副本,该副本不变且未损坏,至少直到覆盖成功完成为止。

注意上面的“至少直到”的使用。

除美国标准(us-east-1)以外的所有区域中,新对象的上传通常在上传后立即可用。 在美国标准中,有时可能会短暂延迟。以前,S3的us-east-1区域(北弗吉尼亚州,以前称为“美国标准”区域)不为新对象提供即时(写后读取)一致性,但现在可以了。

但是,有一个陷阱:在上载对象之前,不得请求该对象。如果是这样,一致性模型就会失效。¹

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的请求将查询存储桶索引的副本,并且如果该索引不知道是否存在对象,则它将查询该索引的更权威版本。如果仍然找不到任何内容,它会在本地“记住”该对象不存在,因为上游查找是一项相对昂贵的操作-因此,它将不会在后续请求中再次向上游查找-但一旦创建了新对象如果对象传播到本地索引,则该对象将可用。相同的理论解释了覆盖和删除的最终一致性。