我找到了Resque:
我可以看到我可以安排延迟工作。我的问题是,它如何检查延迟的工作?如果我在一个月内有5000个延迟工作,我希望它不会每10秒检查一次所有延迟的工作。
那怎么办呢?
答案 0 :(得分:1)
不必检查所有延迟的作业。它在Redis中维护一个有序集,工作按计划时间排序。请参阅以下代码:
https://github.com/elucid/resque-delayed/blob/master/lib/resque-delayed/resque-delayed.rb
每次守护程序唤醒时,只需要检查该集合的第一项(使用ZRANGEBYSCORE命令)。守护进程逐个获取相关作业,直到轮询查询没有返回结果,然后它再次休眠。
通过n获取作业n可以进一步提高性能。它可以使用服务器端Lua脚本作为轮询查询来实现:
local res = redis.call('ZRANGEBYSCORE',KEYS[1], "-inf", ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
return res
else
return false
end
在一次往返中,此脚本获取10个作业(如果可用),并从zset中删除它们。比Resque-delayed目前要求的11 ZRANGEBYSCORE和10 ZREM要好得多。