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

3
我找到了Resque:

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

我发现它可以安排延迟作业。我的问题是,它如何检查延迟的作业?如果一个月时间内有5000个延迟的作业,我希望它不会每10秒检查所有延迟的作业。
那么它是如何实现的呢?
1个回答

1
它不必检查所有延迟的作业。它在Redis中维护一个排序集合,作业按其计划时间排序。请参见以下代码:

https://github.com/elucid/resque-delayed/blob/master/lib/resque-delayed/resque-delayed.rb

每次守护进程唤醒时,只需要检查集合中的第一个项目(使用ZRANGEBYSCORE命令)。 守护进程逐个获取相关作业,直到轮询查询不返回结果,然后再次休眠。
通过一次获取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要好得多。

好的,谢谢。我更倾向于寻找一个事件驱动的解决方案。 - meso_2600
也许你有关于如何处理事件型工作的想法?例如,我有一些用户安排在一个月后发送电子邮件,所以每隔5分钟在Redis上执行zrange没有意义(我假设所有先前的工作都已完成,并且没有用户安排下个月的任何工作)。 - meso_2600
不使用Resque/Redis,你可以在系统级别上使用cron/at来完成。你也可以使用Ruby模块,如rufus-scheduler或类似的包。 - Didier Spezia
是的,我考虑过,但我认为eBay没有5000个cron作业来设置带有“已过期”标志的物品。 - meso_2600

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接