Node.js + Redis Sorted Set 延时任务池

生产者

添加任务时将 value 设置为任务名称并携带序列化的参数 name@params, score 设置为任务开始执行的时间戳。在每次加入任务时首先判断任务是否已经存在,如果存在跳过处理,如果不存在将任务加入任务池。

消费者

取出 score 大于 0(表示任务未执行) 且小于当前时间戳(表示任务已经到达预设执行时间)的任务,将这些任务的 score 设置为 0 表示任务正在执行中,将任务的执行次数加 1。判断任务执行次数是否已经超过限制,如果超过限制,删除任务与任务执行次数,设置任务失败执行任务,如果没有超过限制,执行任务。如果任务执行成功删除任务与任务执行次数,如果失败重新将任务加入任务池。完成一次任务获取执行周期后重新发起另一次任务获取执行周期。

备注

这个延时任务池适用于单个任务执行时间不是很长的情况,如果单个任务执行时间很长,并且每个任务的延时时间较短的情况下,会造成一次任务获取执行周期完成后,任务池中的其他任务已经过期很久。针对这样的情况不再采用一次任务获取执行周期完成后再发起另一次任务获取执行周期,而是采用定时任务,每隔一段时间都完成依稀获取执行任务周期,每个周期完成后不用再做处理,定时任务会不停地获取执行任务。

2016-09-22 10:0794