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

Ruby on rails 启动同一作业的多个延迟作业进程,ruby-on-rails,ruby,jobs,delay,Ruby On Rails,Ruby,Jobs,Delay,我在运行多个工作人员的设置中使用延迟作业。就我的问题而言,这并不重要,但假设我运行了10个工人(目前在开发模式下这样做) 我遇到的问题是,有时两个不同的工作人员开始处理同一个作业,在我的作业对象上调用perform方法 据我所知,延迟作业是使用悲观锁定来防止这种情况发生,但似乎有时在第一个工人有时间实际锁定作业之前,仍然有足够的时间锁定和窃取作业 我只是想看看是否有其他人遇到过这个问题,或者是我的设置有问题。我正在使用Postrgres,这在我的开发机器和我托管它的Heroku上都会发生 我会在

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

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

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

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

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


谢谢

我们已经通过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 *
控制台会话2:

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

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

我看到类似的情况。无法完全跟踪它,但在检查锁和创建锁之间,似乎有多个工人正在抓取和执行作业。我应该说,我发现在初始值设定项中设置
Delayed::Worker.read_ahead=1
似乎可以缓解问题。Resque也有同样的问题,没有找到解决方案谢谢伙计们,这真的很令人沮丧,即使尝试将我的对象锁定在作业中有时也不起作用。我会试着提前阅读,看看它是否有用。不,我们实际上只是放弃了,用Sidekiq解决方案替换了所有东西。我必须说,虽然建立Redis和Sidekiq听起来需要更多的工作,但这是非常值得的。自从我们改变了它之后,我们的性能和稳定性都有了很大的提高。我们的Sidekiq员工自从我们换了工作以来已经处理了近5000万个工作岗位,没有任何不是我们自己造成的问题。:)
User.find(1).with_lock do sleep(1); puts "worker 2 done" end