我的应用程序接收电子邮件,将其存储到电子邮件模型(作为回形针附件的电子邮件)并进行处理。有时会发生在处理时间内电子邮件消息不可用的情况。到目前为止,我还没有能够重现这个问题,但它偶尔发生在我的生产服务器上。
我怀疑在堆栈中的某个地方异步处理文件的保存。但是在哪里。
保存电子邮件模型并以
开始处理email = Email.new
email.yaml_message = StringIO.new(@message.to_yaml)
email.save!
Email.delay(:retry => false).process(email.id)
这是Sidekiq的延迟扩展,用于将处理移动到新线程中。
然后在电子邮件模型中,我用
阅读了该消息def message
begin
Mail::Message.from_yaml(File.read(yaml_message.path))
rescue
nil
end
end
在电子邮件处理过程中,我致电message.from
,有时邮件为nil
。但是当我进入服务器并在控制台中打开模型时,消息就在那里。除了异步文件保存之外我什么也想不到可能导致这样的事情。
Paperclip是引入异步文件保存还是在堆栈中更深层次?
答案 0 :(得分:0)
问题是服务器上运行的Sidekiq进程已经过时了。我应该只运行一个Sidekiq进程,但其中有四个。另一个副问题不是问题,但最古老的流程是指已经从服务器中删除的代码。
现在我需要弄清楚如何在部署新版本时处理Capistrano,Monit和长期运行的Sidekiq进程。