resque如何检查何时运行作业?

时间:2013-04-25 14:51:39

标签: ruby redis delayed-job resque

我找到了Resque:

  

https://github.com/elucid/resque-delayed

我可以看到我可以安排延迟工作。我的问题是,它如何检查延迟的工作?如果我在一个月内有5000个延迟工作,我希望它不会每10秒检查一次所有延迟的工作。

那怎么办呢?

1 个答案:

答案 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要好得多。