Amazon s3 如果我将文件流式传输到s3,那么一旦文件完成,事件是否会触发?
正如标题所说,如果我为put事件将一个事件附加到S3存储桶,并将一个文件流式传输到该存储桶,那么一旦上传开始,事件会触发吗?这样,接收方就可以开始下载该文件的流Amazon s3 如果我将文件流式传输到s3,那么一旦文件完成,事件是否会触发?,amazon-s3,streaming,amazon-sqs,Amazon S3,Streaming,Amazon Sqs,正如标题所说,如果我为put事件将一个事件附加到S3存储桶,并将一个文件流式传输到该存储桶,那么一旦上传开始,事件会触发吗?这样,接收方就可以开始下载该文件的流 或者该事件是否会在文件上传完成后触发?您考虑的问题有两个: 直到上传完成,事件才会触发 将对象写入S3始终是一个原子操作。写入操作要么成功完成,要么根本没有发生。。。在成功完成之前,对象实际上并不存在于bucket中 如果您正在将一个新对象写入一个bucket,对该对象的授权请求将返回404错误,至少在上传成功完成之前是这样 如果要
或者该事件是否会在文件上传完成后触发?您考虑的问题有两个:
- 直到上传完成,事件才会触发
- 将对象写入S3始终是一个原子操作。写入操作要么成功完成,要么根本没有发生。。。在成功完成之前,对象实际上并不存在于bucket中
PUT
上载、PUT/Copy和多部分
由于这些原因,当上传尚未完成时,S3无法将您的文件流式输出给使用者
要做到这一点,需要一个不同的解决方案(尽管S3当然可以在流式处理完成后用作永久存储库)
一致性模型中断。几乎可以肯定的是,这表明到达S3的请求会参考bucket索引的副本,如果索引不知道对象是否存在,则会参考更权威的索引版本。如果仍然找不到任何东西,它会在本地“记住”对象不存在,因为上游查找是一个相对昂贵的操作——因此它不会在后续请求中再次向上游查找——但一旦新对象的创建传播到本地索引中,该对象将可用。同样的理论解释了覆盖和删除的最终一致性。我正在努力寻找关于新对象的PUT事件触发的确切时间的任何信息。请记住,数据可能在写入完成后的一段时间内才可见,事件是在客户端写入结束时触发的,还是在数据可供读取时触发的?我是否只需要重试读取直到它到达那里?@fiddlesticks它基本上是在
200ok
响应发送到客户端之后立即执行的。如果在此特定路径上从未存在任何对象,并且您从未尝试在此特定路径上执行GET
或HEAD
,则该对象应在触发触发器的同时可用。如果您正在覆盖对象,那么最安全的方法是启用bucket版本控制,然后使用事件提供的对象版本ID,并通过其key+version-ID故意请求新版本。您是有问题,还是只是试图避免潜在问题?@fiddlesticks,谢谢你把我的注意力带回这个问题上来。我更新了一些旧的信息,以反映S3中当前记录和观察到的内容。我们有一个Kinesis连接器,它将记录保存到S3,然后将记录加载到红移。我正在研究使用清单文件,以便Redshift COPY命令知道哪些文件应该在S3中加载。我也在考虑是否通过lambda进行红移加载,好像一旦S3文件可用,lamda就会被触发,那么一切都好了。然而,我已经意识到,由于写后读的一致性,这两项都不是必需的:我们的连接器在调用副本之前进行S3写入,因此红移加载过程保证可以看到S3文件。如果红移加载是异步的,则使用清单文件是可以的,但它需要第二个Kinesis流来获取清单,这使延迟增加了一倍。这似乎是AWS在博客中提到的标准模式,但我认为使用Lambda会更简单、更快。事实证明它是不需要的,所以保持简单。