如何设置Sidekiq perform_later的延迟时间,让任务延后1分钟入队?
实现方案
Rails Active Job 原生支持延迟调度能力,完全可以满足你「等待指定时间后再将任务入队」的需求,无需在任务执行逻辑中嵌入sleep语句。你可以通过set方法指定延迟时长,再触发任务入队即可:
# 延迟1分钟后将任务推入队列 MyJob.set(wait: 1.minute).perform_later(args)
原方案的核心问题
你之前写的内嵌sleep的方案有两个明显缺陷:
- 任务会立即入队,执行阶段才进入休眠,完全不符合你延迟入队的预期
- 休眠期间会持续占用后台任务worker的执行线程,该worker在休眠期无法处理其他任务,并发量高时会直接导致整个任务队列阻塞
扩展用法
如果需要指定固定的时间点执行任务,可以使用wait_until参数:
# 指定次日14:00将任务入队执行 target_time = Time.now.tomorrow.change(hour: 14, minute: 0) MyJob.set(wait_until: target_time).perform_later(args)
以上能力是Active Job的通用接口,Sidekiq、Delayed Job、Resque等主流后台任务适配器都原生支持,不需要额外修改适配配置。
内容的提问来源于stack exchange,提问作者Tejas Zambre
相关产品推荐
相关产品推荐

