Mis*_*Moo 5 ruby-on-rails carrierwave sidekiq
不幸的是,对于那些有类似问题的人来说,赏金被授予了一个无法解决这个问题的答案.
我有一个带图像上传的表单(heroku到s3).当我提交表单时,我的rails服务器会在向用户返回响应之前等待上传图像的后台作业.这会导致每次上传图像时应用程序超时.
目前的活动顺序:
所需的活动顺序:
上传代码
class PhotoUploader < CarrierWave::Uploader::Base
include ::CarrierWave::Backgrounder::Delay
include CarrierWave::MimeTypes
process :set_content_type
storage :fog
end
Run Code Online (Sandbox Code Playgroud)
Carrierwave :: Backgrounder初始化程序
CarrierWave::Backgrounder.configure do |c|
c.backend :sidekiq, queue: :carrierwave
end
Run Code Online (Sandbox Code Playgroud)
用户模型
class User < ActiveRecord::Base
mount_uploader :photo, PhotoUploader, delayed: true
process_in_background :photo
end
Run Code Online (Sandbox Code Playgroud)
没有控制器代码,因为表单由ActiveAdmin处理.我可以覆盖任何需要的地方,但无法弄清楚需要改变的地方.
为了获得正确的事件顺序,我需要更改什么?
这里的根本问题是Heroku严格限制请求可以在不将数据发送回客户端的情况下阻止多长时间.如果达到该限制(初始字节为30秒),Heroku将超时您的请求.对于文件上传,很可能会达到此限制.
最好的方法是让用户的浏览器首先直接将文件上传到S3.这里有一些与此相关的讨论:使用Carrierwave直接上传到S3
如果您使用类似jQuery文件上载插件(https://github.com/blueimp/jQuery-File-Upload)的内容,那么流程将类似于:
这使您的Web服务器可以专注于仅提供请求而不会阻止文件上载,这可能需要很长时间.
由于Heroku的限制,这需要更多的工作 - 但最终我认为是避免超时限制的唯一选择.
此外,我建议您创建一个上载S3存储桶,然后设置S3生命周期策略以清除早于某个时间间隔的文件.当您进行直接文件上传时,由于用户放弃等原因,某些上传文件通常不会被处理,因此生命周期会完成清理这些文件的工作.
| 归档时间: |
|
| 查看次数: |
1319 次 |
| 最近记录: |