clockwork+sidekiq做耗时任务

2013年9月28日 10:29

sidekiq是一个基于colluloid的任务队列系统,在使用sidekiq之前,我自己用clockwork和redis构建了一个任务调度和分发系统,其中有一些统计的工作,需要遍历redis中的所有记录。随着记录的不断增长,遍历一次的时间越来越长,影响到clockwork的工作了,于是将这部分耗时的工作丢给sidekiq处理。

将原来的类变成sidekiq的worker,将所有这些类的rb文件在sidekiq_env.rb中require进来。

class HardJob
  include Sidekiq::Worker
  def perform opt=:take_snapshot
    case opt.to_sym
    when :take_snapshot
      HardJob.new.take_snapshot
    when
    ...
  end
  ...
end

clockwork的脚本中,require "sidekiq_env.rb"

HardJob.delay.perform_async :take_snapshot

在另一个终端中运行

sidekiq -r ./sidekiq_env.rb

从日志中可以看到sidekiq开始异步执行任务。

clockwork使用

2013年9月24日 21:15

在定时或者周期执行任务时,crontab是常用的工具,但是很多时候,crontab不是最好的选择。clockwork是ruby中替代crontab的一个gem。

在include Clockwork模块后,可以很直观,方便的管理任务,可以精确到秒的执行任务。

require 'clockwork'
include Clockwork

handler do |job|
  puts "Running #{job}"
end

every(10.seconds, 'frequent.job')
every(3.minutes, 'less.frequent.job')
every(1.hour, 'hourly.job')

every(1.day, 'midnight.job', :at => '00:00')

使用clockwork的一大好处是可以用ruby进行管理,复用redis连接,环境初始化等