补充一下 crontab 是我之前用的方式,另外有同事正在使用 sidekiq_cron
我觉得这两种方式都有痛点:
两者都需要注意任务重复触发的问题。
利用 sidekiq 自带的 perform_in & perform_at 实现 schedule 的问题目前我看来就是实现起来不如前面二者简便,不能直观看出系统中有哪些计划任务
尝试利用 sidekiq 自身的 perform_in 来实现每分钟定时任务
大家是否试过这种做法,有什么样的坑?
首先这个每分钟任务是可以接受初始化的时候多执行几次的,但是应该随时间快速收敛到只有一个。
这个方案的好处是不管部署了多少个实例,跨了多少个服务器,任务计划总是一份。
# initializers/schedule_seeds.rb
SchedulePerMinuteWorker.perform_async
require 'sidekiq/api'
class SchedulePerMinuteWorker
include Sidekiq::Worker
def perform
# 清除重复的任务计划
Sidekiq::ScheduledSet.new.select {|job| job.klass == self.class.name }.each(&:delete)
run_schedule_works
# 结束时将自己推入
SchedulePerMinuteWorker.perform_in(1.minute)
end
# 每分钟执行的任务
def run_schedule_works
# TODO 业务逻辑
end
end
我发现大部分的定时任务都不需要特别精确,能否举例一些业务场景需要用到精确的定时任务?