嘿。我使用delayed_job 进行后台处理。我有 8 个 CPU 服务器,MySQL,我启动了 7 个延迟作业进程
RAILS_ENV=production script/delayed_job -n 7 start
Q1: 我想知道是否有可能 2 个或更多延迟作业进程开始处理同一个进程(数据库延迟作业中的同一记录行)。我检查了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 个延迟作业是一个好的数字吗?为什么是/不是。
谢谢 10 倍!