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

时间:2012-02-21 22:42:39

标签: ruby-on-rails-3.1 delayed-job thin unicorn

我最近把delayed_job带到了我的Rails 3.1.3应用程序中。开发中 一切都好。我甚至将我的DJ发布在与我相同的VPS上 生产应用程序使用相同的生产应用程序服务器(Thin), 一切都很好。然而,一旦我发布到生产,所有 地狱破裂:没有任何工作进入工作表 正确地说,我开始在所有日志中看到以下内容 已完成的工作:

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并没有方法名称?当然不正确。所以我看了看 数据库中作业的序列化处理程序并看到:

"--- !ruby/object:Delayed::PerformableMethod\nattributes:\n  id: 13\n 
event_id: 26\n  name: memememe\n  api_key: !!null \n" 

没有类或方法名称的指示。当我加载YAML时 一个对象,并在我得到的PerformableMethod上调用#object 零。为了踢,我然后在破碎的生产上启动控制台 应用程序和推迟相同的工作。这次处理程序看起来像:

"--- !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个瘦服务器 - 前面没有Web代理
  • 在制作中,我使用Nginx运行2个以上的Thin服务器和代理服务器。 他们通过UNIX套接字进行交谈
  • 当我尝试独角兽时,它是由Nginx代理的1个app服务器 UNIX套接字

网络代理/ Nginx可以与它有关吗?拜托,非常感谢任何见解。我花了很多时间 整合delayed_job并且不愿意搁置工作,或者更糟糕的是, 扔了它。谢谢你的阅读。

2 个答案:

答案 0 :(得分:1)

我通过不使用#delay来解决这个问题。相反,我用自定义作业替换了所有“model.delay.method”代码。这样做就像一个魅力,最终更灵活。此修复程序适用于Thin。我没有用Unicorn测试过。

答案 1 :(得分:0)

我遇到了与rails 3.0.10和dj 2.1.4类似的问题,当从控制台vs从app服务器运行时,它肯定是一个不同的yaml库。瘦,独角兽,nginx。我将分享我提出的任何解决方案

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

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

这是为了修复YAML解析错误,强制YAML使用'syck'。删除它需要我修复.yml文件的潜在问题。有关此here

的更多信息

现在,我的延迟作业记录处理程序在通过服务器(在我的情况下是独角兽)和控制台创建的那些之间匹配。我的服务器和延迟的工作人员都在捆绑器中启动

独角兽

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