bull添加 job 时有一个 delay 选项,用于指定 job 延迟多久之后执行
当 add job时,如果delayedTimestamp 不为 0,则将 job id 加入 delayed zset
然后发出 delayed 事件,触发 updateDelayTimer
delayed zset 的成员是 job id,score 是一个计算后得到的 timestamp
它将时间戳数字二进制左移十二位,然后低十二位填充job id的值,最后得到一个不会重复的 timestamp
-- Check if job is delayed
local delayedTimestamp = tonumber(ARGV[8])
if(delayedTimestamp ~= 0) then
local timestamp = delayedTimestamp * 0x1000 + bit.band(jobCounter, 0xfff)
rcall("ZADD", KEYS[5], timestamp, jobId) -- add jobid to delayed set
rcall("PUBLISH", KEYS[5], delayedTimestamp) -- emit updateDelayTimer
else
当queue接收到delayed事件后,会执行 updateDelayTimer 方法
const messageHandler = (channel, message) =&
Bull任务队列中,通过delay选项可设定job延迟执行。延迟执行时,job id进入delayed zset,触发updateDelayTimer。delayed zset的timestamp经过特殊处理确保唯一。updateDelayTimer定期检查并执行已到时间的job,将其从delayed zset移除并按优先级放入相应队列。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



