gpt4 book ai didi

ruby-on-rails - 启动同一作业的多个延迟作业进程

转载 作者:数据小太阳 更新时间:2023-10-29 07:01:01 25 4
gpt4 key购买 nike

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

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

据我所知,Delayed Job 正在使用悲观锁定来防止这种情况发生,但有时它似乎仍然有足够的时间在第一个 worker 有时间实际锁定它之前锁定它。

我只是想看看有没有其他人遇到过这个问题,或者是我的设置有问题。我正在使用 Postrgres,这发生在我的开发机器和我托管它的 Heroku 上。

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

谢谢!

最佳答案

我们已经通过 12 名 worker 的延迟工作运行了大约 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 控制台 session 并执行此操作:

控制台 session 1:

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

控制台 session 2:

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

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

关于ruby-on-rails - 启动同一作业的多个延迟作业进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com