Amazon S3,如何处理从上传到对象可用性的延迟

AnA*_*ice 7 ruby-on-rails amazon-s3 paperclip amazon-web-services ruby-on-rails-3

我正在构建的应用程序允许用户上传文件。文件上传到 Amazon S3 的私有存储桶中。

然后用户可以下载该文件,我们通过创建一个过期 URL 来允许下载该文件:

AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => true)
Run Code Online (Sandbox Code Playgroud)

我们遇到的问题是,从通过 AWS::S3::S3Object.url_for 上传到可用存在短暂的延迟。如果用户在上传后立即尝试下载文件,亚马逊会出现错误:

215412-NameError (uninitialized constant Attachment::AWS):
215413-  app/models/attachment.rb:32:in `authenticated_url'
215414-  app/controllers/attachments_controller.rb:33:in `show'
Run Code Online (Sandbox Code Playgroud)

关于如何优化、处理这种延迟有什么想法吗?

谢谢

Igo*_*r.K 5

我知道已经过去很多年了,但对于那些带着同样问题来到这里的人来说,这是我发现的。

首先,这就是AWS S3 的工作原理:

进程将新对象写入 Amazon S3 并立即列出其存储桶中的密钥。在更改完全传播之前,该对象可能不会出现在列表中。

我发现处理此行为的最佳方法是等待上传的对象出现在列表中,然后再允许用户下载它。

就像是:

_put_object(filename)
while True:
    if _file_exists(filename):
        break
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

要检查可用性,我们可以使用client.head_objectclient.list_objects_v2

有一种观点认为 list_objects_v2 工作得更快


And*_*icz 2

您看到延迟多长时间?这种情况多久发生一次?

我们使用https://github.com/PRX/s3-swf-upload-plugin从浏览器直接上传到 s3 ,当我收到文件存在的回调时,我从未见过错误尚未可用。

我们做的另一件事是在第一次上传时将对象标记为一种状态,然后使用 asycnh 进程来验证文件,只有在将其标记为有效后,我们才继续处理它。然而,这会导致延迟,因此对您来说可能不是一个很好的答案。

  • 到目前为止,您在环境中没有看到任何延迟,并不意味着您不会遇到延迟。我见过几分钟的延迟(但我已经上传了数百万个文件)。如果您查看 AWS 论坛,您会发现人们有时会遇到延迟。 (2认同)