Gem Sidekiq 的任务计划,仅支持精确定时?!

mimosa · 2012年11月28日 · 最后由 mimosa 回复于 2013年07月26日 · 5927 次阅读
MyWorker.perform_in(3.hours, 'mike', 1)
MyWorker.perform_at(3.hours.from_now, 'mike', 1)

我要 每天 00 点 00 分 开始的计划任务如何实现?!

别告诉我用 Resque ——!

用 whenever(cron)

#1 楼 @cqpx 这个不一样的,Sidekiq 这个应该是延迟到什么时候在执行,而 Cron 的是定时执行

#2 楼 @huacnlee 说的对,Sidekiq 默认心跳 15 分钟,如果和你设定的时间岔开就不能准确执行~~ 现在在试 sidekiq-scheduler,不知道它的Sidekiq::Scheduler.dynamic是否完善。

不懂楼主的意思~ 不过我用过 clockwork 还不错..

另搭车问我想要每五分钟运行一个任务。怎么搞比较好呢..?

现在是跑一个 sidekiq, 然后再跑一个 clockwork, 感觉有点浪费啊..

@huacnlee 楼主就是要在 0 点 0 分执行一个任务,为什么不能用whenever? 这个就应该用whenever啊 难道我理解错楼主的意思?

#4 楼 @ruohanc 我需要准确定时和间隔定时任务的方案,你如果只需要间隔定时,sidekiq 自身就可实现。

#5 楼 @tumayun 我需要多线程,队列来执行网页数据抓取任务。之前是用 Resque 的。

@mimosa 你可以在任务里面开多个线程啊

whenever,了解下系统的 cron

rufus-scheduler这个gem也不错,还能在 win 下安装过

每 5 分钟跑一次写法


scheduler.in '5m' do
  puts "5m after now"
end

#10 楼 @ywjno sidekiq-scheduler 是基于 rufus-scheduler 的,靠 Sidekiq 的 workers 进程运行,无需单独的计划进程。 @ruohanc

whenever 是每隔指定时间重复做指定的任务,周而复始。而 sidekiq 是在你指定时刻做指定任务,如果成功,这个任务就从队列里移除,以后再也不做了;如果失败,超过指定的重试次数也会从队列里移除。

sidekiq 比较蛋疼的是不能在 app 运行时动态新建队列。比如我想要根据用户填写的邮箱的域新建队列,每个队列只往一个域发送邮件,就很难实现。我尝试过以下方式(在 Rails 4.0 里),但是邮件始终发不出去。

class MailWorkerPool
  # 添加类级别的属性
  class << self
    attr_accessor :workers
  end

  def self.deliver_mail_async
    # Worker类的容器,每个邮箱域一个Worker类
    self.workers = {} unless self.workers
    User.all.find_each do |user|
      recipient = user.email

      # 获取该用户邮箱的域(例如 gmail.com)
      domain = recipient.split('@').last.to_sym

      # 动态生成匿名Worker类,每个邮箱域一个
      self.workers[domain] = Class.new do
        include Sidekiq::Worker

        # 经测试,domain变量是能获取到的
        sidekiq_options queue: domain, retry: 5
        def perform(recipient_email)
          # 发送邮件
          UserMailer.some_mail(recipient_email).deliver
        end
      end unless self.worker[domain]

      # 使用匿名Worker类执行异步发送
      worker[domain].perform_async(recipient)
    end
  end
end

失败的原因就是 sidekiq 不能动态新建队列。

#13 楼 @aetherus 可以动态: Sidekiq.reload_schedule! if Sidekiq::Scheduler.dynamic

需要 登录 后方可回复, 如果你还没有账号请 注册新账号