我最近在我的Rails 3.1.3应用程序中引入了delayed_job。在开发过程中一切都很好。我甚至在同一个VPS上使用相同的生产应用服务器(Thin)设置了我的DJ版本,并且一切都很好。然而,一旦我发布到生产环境中,一切都变得一团糟:所有工作都没有正确地输入到工作表中,我开始看到所有已处理工作的日志如下:
2012-02-18T14:41:51-0600: [Worker(delayed_job host:hope pid:12965)]
NilClass# completed after 0.0151
2012-02-18T14:41:51-0600: [Worker(delayed_job host:hope pid:12965)] 1
jobs processed at 15.9666 j/s, 0 failed ...
NilClass和没有方法名?这肯定是不正确的。所以我查看了DB中作业的序列化处理程序,发现:
"--- !ruby/object:Delayed::PerformableMethod\nattributes:\n id: 13\n
event_id: 26\n name: memememe\n api_key: !!null \n"
没有类或方法名称的指示。当我将YAML加载到对象中,并在生成的PerformableMethod上调用#object时,返回nil。为了好玩,我启动了损坏的生产应用程序上的控制台,延迟了相同的作业。这次处理程序看起来像:
"--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/
ActiveRecord:Domain\n attributes:\n id: 13\n event_id: 26\n
name: memememe\n api_key: !!null \nmethod_name: :create_a\nargs: []
\n"
而且,这个任务运行得很好。我感到困惑,然后想起读过一些关于DJ与Thin不兼容的内容。所以,我尝试了Unicorn,但很遗憾看到了同样的结果。几个小时后,我认为这与应用服务器如何加载YAML库Psych和Syck以及DJ与它们的交互有关。然而,我不能确定出错的具体原因。
请注意,我正在运行官方版本的delayed_job 3.0.1,但已经尝试升级到主分支,甚至尝试降级到2.1.4。下面是我的阶段和生产环境设置之间的一些显着差异:
- 在阶段中,我在TCP端口上运行1个Thin服务器,没有Web代理。 - 在生产中,我运行2个或更多的Thin服务器,并使用Nginx代理它们。它们通过UNIX套接字通信。 - 当我尝试unicorn时,它是一个应用程序服务器,由Nginx通过UNIX套接字代理。
Web代理/Nginx是否与此有关?任何见解都将不胜感激。我花了很多时间整合delayed_job,不想把工作搁置或者更糟糕的情况是放弃它。谢谢阅读。