8

我在运行多个工作人员的设置中使用延迟作业。就我的问题而言,这并不重要,但假设我运行 10 个工人(目前在开发模式下这样做)。

我遇到的问题是两个不同的工作人员有时会开始从事同一个工作,在我的工作对象上调用 perform 方法。

据我所知,延迟作业正在使用悲观锁定来防止这种情况发生,但似乎有时在第一个工作人员有时间实际锁定它之前仍有足够的时间来锁定窃取作业。

我只是想看看其他人是否遇到过这个问题,或者是否是我的设置行为不端。我正在使用 Postrgres,这既发生在我的开发机器上,也发生在我托管它的 Heroku 上。

我会尝试在我的工作中解决它,但发生这种情况仍然有点问题。理想情况下,延迟的工作永远不会发生在两个进程的同一个工作上。

谢谢!

4

1 回答 1

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 之前结束,你就会遇到比延迟工作更普遍的锁定问题。

于 2014-05-02T21:20:21.163 回答