当客户更改其个人资料照片时,它将点击update
方法,该方法以update.js.erb
作为响应。这是一个快速而直接的过程。但是,在服务器上的幕后,根据个人资料图片会生成一堆文件(其中10个),这些文件需要从服务器上传到Amazon存储桶。这是一个漫长的过程,我不想让客户端等到完成为止。此外,文件上传通常会失败,并显示RequestTimeoutException
,因为它们花费的时间超过15秒。
所有这些都引发了许多问题:
退出update
方法后,如何生成/上传10个文件? main方法完成后,线程将被杀死。
如何在线程内捕获异常?以下代码未捕获超时异常。
threads = []
threads << Thread.new {
begin
# upload file 1 ....
rescue Rack::Timeout::RequestTimeoutException => e
# try to upload again ....
else
ensure
end
}
threads << Thread.new {
begin
# upload file 2 ....
rescue Rack::Timeout::RequestTimeoutException => e
# try to upload again ....
else
ensure
end
}
threads.each { |thr|
thr.join
}
如果超时,尝试重新上传文件的最佳方法是什么?
此问题的最佳解决方案是什么?
答案 0 :(得分:2)
您需要使用delay_job或gem来执行后台任务,但是我想建议sidekiq
答案 1 :(得分:0)
我在一个项目中也遇到了同样的问题。我遇到了一个使用AWS lambda的解决方案。如果您正在使用导轨将图像上传到S3,则可以使用carrierwave gem / rails 5活动存储模块。如果您不使用滑轨,则使用AWS-SDK进行红宝石上传,以在S3上上传文件。只要在S3上创建/修改文件,就可以绑定事件。每当创建文件时,它都会调用lambda函数,您的工作就完成了。可以将它们绑定到lambda函数。在lambda函数中,您可以编写逻辑来创建文件并将其上传回s3。您可以用ruby,node和python编写lambda代码。
此策略可能会为您提供帮助。