【问题标题】:Multiple delayed job processes starting same job启动同一个作业的多个延迟作业进程
【发布时间】: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


【解决方案1】:

我们已经通过 12 名工人的延迟工作运行了大约 6000 万个工作,并且从未收到过有关此情况的报告。您的延迟作业工作者正在运行的 SQL 是什么?您是否使用了改变 postgres 锁定行为的 gem?

这是 DJ sql 对我来说的样子:

UPDATE "delayed_jobs" SET locked_at = '2014-05-02 21:16:35.419748', locked_by =
'host:whatever.local pid:4729' WHERE id IN (SELECT id FROM "delayed_jobs" 
WHERE ((run_at <= '2014-05-02 21:16:35.415923' 
AND (locked_at IS NULL OR locked_at < '2014-05-02 17:16:35.415947') 
OR locked_by = 'host:whatever.local pid:4729') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *

您是否有任何其他代码的锁定问题?您能否尝试运行两个 Rails 控制台会话并执行此操作:

控制台会话 1:

User.find(1).with_lock do sleep(10); puts "worker 1 done" end

控制台会话 2:

User.find(1).with_lock do sleep(1); puts "worker 2 done" end

同时启动这两个,如果 2 在 1 之前结束,则您遇到的锁定问题比延迟作业更普遍。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2016-08-05
    • 2010-12-15
    • 2012-08-19
    • 1970-01-01
    • 2021-04-19
    • 2016-03-29
    • 2016-04-16
    • 2011-03-24
    相关资源
    最近更新 更多