Sidekiq 是一個多線程的後臺任務處理系統,基本概念如下:
job :某一個任務的一次執行;
worker:Sidekiq
是使用 Celluoid 來完成其多線程的控制的, 而 Celluoid 是 Ruby 中的多線程模式 Actor 模式的實現,worker按照任務列表執行任務;
queue:隊列用於區分任務並且讓任務排隊, Sidekiq 中將每一類的任務使用一個 queue 來區分開;
Redis Server:存儲任務的 Redis 來源;
Redis Client:Redis 作爲一個任務提交者, 通過 Worker 向指定的 Redis Client 中提交任務。
以在Rails中使用sidekiq爲例說明。
1.Gemfile添加 :
gem "redis", "~> 3.0.7"
gem 'sidekiq'
2.編輯啓動配置文件 config/sidekiq.yml:
:concurrency: 5 # 併發數 :pidfile: tmp/pids/sidekiq.pid :logfile: ./log/sidekiq.log # 輸出的日誌地址 :queues: - default # 寫在隊列參數中的, 表示讓 sidekiq 處理這個 queue - [myqueue, 2] # 使用數組的形式寫, 第一個參數爲打開的 queue 的名稱, 第二個爲優先級 development: :concurrency: 5 staging: :concurrency: 10 production: :concurrency: 20
3.編輯initializers/sidekiq.rb,初始化Redis和Sidekiq config:
redis_server = '127.0.0.1' # redis服務器
redis_port = 6379 # redis端口
redis_db_num = 0 # redis 數據庫序號
redis_namespace = 'highlander22_sidekiq' #命名空間,自定義的
Sidekiq.configure_server do |config|
config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace }
end
Sidekiq.configure_client do |config|
config.redis = { url: "redis://#{redis_server}:#{redis_port}/#{redis_db_num}", namespace: redis_namespace }
end
4.將 worker 類放到 app/workers文件夾,編輯任務app/workers/test_worker.rb:
class TestWorker include Sidekiq::Worker def perform(name, count) # do somethings puts 'Doing hard work' end end
5.在控制器 action 或者 model 中調用 TestWorker.perform_async:
TestWorker.perform_async('bob', 5)
6.啓動Sidekiq:
bundle exec sidekiq -d 後臺啓動方式
7.使用Rails Console進行測試,執行rails c命令:
TestWorker.perform_async('Hello World', 1)