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

时间:2012-01-13 19:44:31

标签: ruby-on-rails ruby-on-rails-3 amazon-s3 amazon-web-services paperclip

我建立的应用程序允许用户上传文件。该文件将在专用存储桶中上载到Amazon S3。

然后,用户可以通过创建时间到期URL来下载该文件:

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

我们遇到的问题是,通过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'

有关如何优化,处理此延迟的任何想法?

由于

2 个答案:

答案 0 :(得分:1)

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

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

我们要做的另一件事是在首次上传时将对象标记为一个状态,然后使用asycnh进程验证文件,并且只有在标记为有效之后,我们才会继续处理它。 这会导致延迟,所以对你来说可能不是一个很好的答案。

答案 1 :(得分:0)

我知道已经有好几年了,但是对于那些来这里遇到同样问题的人来说,这就是我的发现。

首先,这就是AWS S3 works的方式:

  

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

我发现解决此问题的最佳方法是,等待上载的对象出现在列表中,然后再允许用户下载它。

类似的东西:

_put_object(filename)
while True:
    if _file_exists(filename):
        break
    time.sleep(1)

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

有一个opinion,list_objects_v2的运行速度更快