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