加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 运行多个delayed_job锁表的Rails

发布时间:2020-12-16 21:39:24 所属栏目:百科 来源:网络整理
导读:嘿.我使用delayed_job进行后台处理.我有8个CPU服务器,MySQL和我启动了7个delayed_job进程 RAILS_ENV=production script/delayed_job -n 7 start Q1: 我想知道2个或更多的delayed_job进程是否可以开始处理相同的进程(数据库中的相同记录行delayed_jobs).我检
嘿.我使用delayed_job进行后台处理.我有8个CPU服务器,MySQL和我启动了7个delayed_job进程
RAILS_ENV=production script/delayed_job -n 7 start

Q1:
我想知道2个或更多的delayed_job进程是否可以开始处理相同的进程(数据库中的相同记录行delayed_jobs).我检查了delayed_job插件的代码,但是找不到应该是这样的方式的锁定指令(没有锁表或SELECT … FOR UPDATE).

我认为在lock_by列执行UPDATE之前,每个进程都应该锁定数据库表.他们通过更新locked_by字段(UPDATE delayed_jobs SET locked_by …)来锁定记录.真的够了吗不需要锁定?为什么?我知道UPDATE具有比SELECT更高的优先级,但我认为这在这种情况下没有效果.

我对多线程情况的理解是:

Process1: Get waiting job X. [OK]
Process2: Get waiting jobs X. [OK]
Process1: Update locked_by field. [OK]
Process2: Update locked_by field. [OK]
Process1: Get waiting job X. [Already processed]
Process2: Get waiting jobs X. [Already processed]

我认为在某些情况下,更多的工作可以获得相同的信息,并可以开始处理相同的过程.

Q2:
对于8CPU服务器,7个delayed_jobs是个好数字吗?为什么是/不

Thx 10x!

解决方法

我认为你的问题的答案是“lib / delayed_job / job.rb”的第168行:
self.class.update_all(["locked_at = ?,locked_by = ?",now,worker],["id = ? and (locked_at is null or locked_at < ?)",id,(now - max_run_time.to_i)])

这里只有执行行的更新,如果没有其他工作人员已经锁定了该作业,并且检查表是否更新.因为您的DBMS确保单个查询的执行与其他查询的效果隔离,因此不需要使用表锁或类似方式(可大大降低应用程序性能).在您的示例中,Process2无法获取作业X的锁定,因为当且仅当以前未锁定作业表时才更新作业表.

对于你的第二个问题:这取决于.在8个CPU服务器上.专门为这项工作,8名工人是一个很好的起点,因为工人是单线程的,你应该为每个核心运行一个.根据你的设置,或多或少的工作人员更好.它在很大程度上取决于你的工作.把你的工作作为优势的多核?或者你的工作大部分时间都在等待外部资源?您已经尝试了不同的设置,并查看所有涉及的资源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读