Sidekiq異步任務

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章