在生产环境中使用Thin或Unicorn运行delayed_job时,作业处理程序序列化不正确

4

我最近在我的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,不想把工作搁置或者更糟糕的情况是放弃它。谢谢阅读。
2个回答

1

我解决了这个问题,不再使用 #delay。相反,我用自定义的任务替换了所有的 "model.delay.method" 代码。这样做非常好用,而且更加灵活。这个修复方法在 Thin 中可以正常工作。我还没有在 Unicorn 上进行测试。


0

我在使用Rails 3.0.10和Dj 2.1.4时遇到了类似的问题,很可能是由于在控制台运行与在应用服务器(如thin、unicorn、nginx)中运行时加载了不同的yaml库。如果我找到任何解决方案,我会分享的。

好的,所以从config/boot.rb中删除这些行对我来说解决了这个问题。

require 'yaml'
YAML::ENGINE.yamler = 'syck'

这个被放在那里是为了修复一个YAML解析错误,强制YAML使用'syck'。删除这个需要我修复.yml文件的根本问题。关于此更多信息在这里

现在我的延迟作业记录处理程序在服务器(我的情况下为独角兽)和控制台创建的处理程序之间匹配。我的服务器和延迟作业工作者都在bundler中启动

独角兽

cd #{rails_root} && bundle exec unicorn_rails -c #{rails_root}/config/unicorn.rb -E #{rails_env} -D"

DJ

export LANG=en_US.utf8; export GEM_HOME=/data/reception/current/vendor/bundle/ruby/1.9.1; cd #{rail

s_root}; /usr/bin/ruby1.9.1 /data/reception/current/script/delayed_job start staging

s_root}; /usr/bin/ruby1.9.1 /data/reception/current/script/delayed_job 启动阶段


谢谢Mark。我仍在努力解决这个问题。我目前正在尝试在Nginx/(mod) Passenger中运行我的应用程序。当我知道该应用程序服务器是否更好时,我会回报的。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接