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

标签 ruby-on-rails ruby jobs delay

我在运行多个工作器的设置中使用延迟作业。就我的问题而言,这并不重要,但假设我有 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/

相关文章:

laravel-4 - Laravel 作业和保留状态或保留队列

ruby-on-rails - 如何启用 `request` on Rails 模块

ruby-on-rails - wicked_pdf : footer height/styling

ruby - Rails 将子错误与父错误合并

ruby - 如何使用正则表达式匹配哈希对象中的字符串文字等符号?

ruby-on-rails - 从本地回形针存储迁移到 S3

java - Java 中使用拆分和聚合的并行作业执行

ruby-on-rails - 旧 Rails 应用程序出现奇怪的 Rails 错误 "permission denied: bin/rails"

javascript - rails : Asset Pipeline creates Javascript errors in views scripts weren't intended for

apache-spark - 有没有办法通过 web ui 提交 spark 作业?