【发布时间】:2013-03-15 03:05:13
【问题描述】:
我在运行多个工作人员的设置中使用延迟作业。就我的问题而言,这并不重要,但假设我运行 10 个工人(目前在开发模式下这样做)。
我遇到的问题是两个不同的工作人员有时开始从事同一个工作,在我的工作对象上调用 perform 方法。
据我所知,Delayed Job 正在使用悲观锁定来防止这种情况发生,但似乎有时在第一个工作人员有时间实际锁定它之前仍有足够的时间来锁定它。
我只是想看看其他人是否遇到过这个问题,或者是否是我的设置行为不端。我正在使用 Postrgres,这既发生在我的开发机器上,也发生在我托管它的 Heroku 上。
我会尝试在我的工作中解决它,但发生这种情况仍然有点问题。理想情况下,延迟的工作永远不会发生在两个进程的同一个工作上。
谢谢!
【问题讨论】:
-
我看到了类似的东西。无法完全追踪它,但似乎在检查锁和制作锁之间,多个工作人员正在抓取并执行该作业。
-
我应该说我发现在初始化程序中设置
Delayed::Worker.read_ahead=1似乎可以缓解问题。 -
与 Resque 有同样的问题,没有找到解决方案
-
谢谢大家,这真的很令人沮丧,即使尝试将我的对象锁定在作业中有时也不起作用。我会尝试提前阅读,看看是否有帮助。
-
不,我们实际上只是放弃并用 Sidekiq 解决方案交换了一切。我必须说,虽然听起来设置 Redis 和 Sidekiq 需要做更多的工作,但这是非常值得的。自从我们改变它以来,我们已经有了更好的性能和或多或少“完美”的稳定性。自从我们改变以来,我们的 Sidekiq 员工已经处理了近 5000 万份工作,没有出现任何不是我们自己造成的问题。 :)
标签: ruby-on-rails ruby jobs delay