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 方法