多个延迟的作业流程开始相同的工作

Ken*_*rin 7 ruby jobs ruby-on-rails delay

我在运行多个工作人员的设置中使用延迟工作.为了我的问题,它并不重要,但是假设我运行了10个工作者(目前在开发模式下这样做).

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

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

我只是想看看是否有其他人遇到过这个问题,或者我的设置是否行为不端.我正在使用Postrgres,这种情况发生在我的开发机器和Heroku上我主持它.

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

谢谢!

Joh*_*gle 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 *
Run Code Online (Sandbox Code Playgroud)

您是否遇到其他代码的锁定问题?您可以尝试运行两个 Rails 控制台会话并执行以下操作:

控制台会话 1:

User.find(1).with_lock do sleep(10); puts "worker 1 done" end
Run Code Online (Sandbox Code Playgroud)

控制台会话 2:

User.find(1).with_lock do sleep(1); puts "worker 2 done" end
Run Code Online (Sandbox Code Playgroud)

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