我在运行多个工作人员的设置中使用延迟作业。就我的问题而言,这并不重要,但假设我运行 10 个工作线程(当前在开发模式下执行此操作)。
我遇到的问题是两个不同的工作人员有时开始处理同一项工作,调用我的工作对象上的执行方法。
据我所知,延迟作业正在使用悲观锁定来防止这种情况发生,但有时在第一个工作人员有时间实际锁定作业之前,它似乎仍然有足够的时间来锁定窃取作业。
我只是想看看其他人是否遇到过这个问题,或者是否是我的设置行为不当。我正在使用 Postrgres,这种情况在我的开发机器和我托管它的 Heroku 上都会发生。
我会在工作中尝试解决这个问题,但发生这种情况仍然有点问题。理想情况下,永远不会发生延迟作业从两个进程处理同一个作业的情况。
Thanks!
我们通过 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 之前结束,那么您就会遇到比延迟作业更普遍的锁定问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)