2016年10月26日 星期三

非同步執行工具排程-Sidekiq Scheduler

Sidekiq-schedule是在使用Sidekiq當作非同步執行工具時的排程套件。


sidekiq-schedule實作

實作前確認已經安裝sidekiq gem,並且實作完成。

步驟1:安裝sidekiq-schedule,在Gamfile中新增以下指令後,執行bundle install
gem 'sidekiq-scheduler', '2.0.0'

步驟2:在confit目錄下建立排程設定YAML檔,本實作為config/scheduler.yml
  • test_job:Job名稱,可以自己變更
  • cron:時間排程,一般以5個*來做定義,由左至右分別為:分 時 日 月 週
    • 若要定義為每天晚上的10:30分執行,則設定為cron: “30 22 * * *”
    • 若要指定為每週一凌晨3:00分執行,則設定為cron: “0 3 * * 1”
    • 關於cron更詳細的設定,可以參考Cron Wiki
    • 可以使用every來取代cron,例如每30秒執行一次,則可以使用every: 30s
  • class:要執行的Class,在2.0.2以上版本開始支援ActiveJob的關係,所以可以直接在class指定Job Class,但是因為使用的2.0.0並未支援ActiveJob的關係,所以需要詳細指定類別的路徑。
  • wrapped:要執行的Class,在2.0.2以上版本不需要此參數。
  • job_class:要執行的Class,在2.0.2以上版本不需要此參數。
  • arguments:執行參數。
YAML範例
  test_job:
    cron: "0 23 * * *"
    class: ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper
    wrapped: SidekiqTestJob
    args:
      -
        job_class: SidekiqTestJob
        # job_id:     job_id,
        # queue_name: queue_name,
        # priority:   priority,
        arguments: ["533fa9ab-57e2-4c96-9b36-3f9c45ba317a", "Test Notification!"]
        # locale:     I18n.locale
步驟3:設定sidekiq.yml檔,寫入以下參數啟動Schedule,sidekiq.yml會在Sidekiq啟動時自動Load入,也可以不新增sidekiq.yml,而把參數寫到步驟2的scheduler.yml第1行進行宣告。
:dynamic:true
步驟4:於config/initializers/新增初始化引入,把scheduler.yml引入。

./config/initializers/sidekiq_scheduler.rb
require 'sidekiq/scheduler'
Dir[File.expand_path('../lib/workers/*.rb',__FILE__)].each do |file| load file; end

Sidekiq.configure_server do |config|

  config.on(:startup) do
    Sidekiq.schedule = YAML.load_file(File.expand_path("../../../config/scheduler.yml",__FILE__))
  end
end
步驟5:Sidekiq-schedule能夠擴充Sidekiq Web,新增一個Recurring Jobs page,只需要再routes.rb新增
  require 'sidekiq/web'
  require 'sidekiq-scheduler/web'
  mount Sidekiq::Web => '/sidekiq'


Console Command


可以登入Rails Console,操作排程

變更排程

Sidekiq.set_schedule('sidekiq_test_job',
       { 'every' => ['1m'],
         'class' => 'ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper',
         'args' => [ { "job_class"=>"SidekiqTestJob",  "arguments" => ["Test Job", "1", "2"] }]})

移除排程

2.2.0 :002 > Sidekiq.remove_schedule 'sidekiq_test_job'
 => true

實作結果


沒有留言: