Sidekiq 是一個多線程的後臺任務處理系統, 在其出來之前, 還存在一個名爲 Resque 產品(Github 製造), 由於 Resque 是多進程模型, 因此當任務量變多的時候, Resque 所消耗的內存資源會很是的大, 因此就有了藉助 Celluoid 來完成多線程形式的 Reqsue 也就是今天的 Sidekiq (2.15.xx)linux
Job
在 Sidekiq 中的 Job 指的是某一個任務的一次執行, 注意與咱們一般意義上說 「一個 Job」 指的是一類 Job.git
Worker
由於 Sidekiq
是使用 Celluoid 來完成其多線程的控制的, 而 Celluoid 是 Ruby 中的多線程模式 Actor 模式的實現, 因此在 Sidekiq 中的 Worker 咱們以擬人的方式去理解. 我擁有一個工人, 不過有一點要區分的是這些 Worker 都是按照」操做手冊」在執行任務, 因此他不會被限制在某一類任務上.github
Queue
隊列的意義在於區分任務而且讓任務排隊, Sidekiq 中將每一類的任務使用一個 Queue 來區分開.web
Redis Server
指存儲任務的 Redis 來源, 在 Sidekiq 2.x 時代其有一個瓶頸就是不管多少個 Sidekiq Instance 但只能擁有一個 Redis Server, 也就是任務處理的最大速度被限制在了單臺 Redis 服務器每秒的處理速度, 大約在 5000 job/s, 可是在 Sidekiq 3.0 之後, 其擴展了 redis_pool 的參數, 每個 Worker 能夠選擇使用 Redis Server.redis
Redis Client
Redis 做爲一個任務提交者, 透過 Worker 向指定的 Redis Client 中提交任務.數據庫
gem "redis", "~> 3.0.7" gem 'sidekiq' gem 'sinatra' # 用於使用自帶的監控頁面
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| p redis_server # 這個能夠去掉 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
: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
class HardWorker include Sidekiq::Worker def perform(name, count) # do somethings puts 'Doing hard work' end end
HardWorker.perform_async('bob', 5)
richard@richard:~/ipucc/blog$ bundle exec sidekiq --help 2014-06-12T10:16:35Z 22651 TID-6dezc INFO: sidekiq [options] -c, --concurrency INT processor threads to use -d, --daemon Daemonize process -e, --environment ENV Application environment -g, --tag TAG Process tag for procline -i, --index INT unique process index on this machine -q, --queue QUEUE[,WEIGHT] Queues to process with optional weights -r, --require [PATH|DIR] Location of Rails application with workers or file to require -t, --timeout NUM Shutdown timeout -v, --verbose Print more verbose output -C, --config PATH path to YAML config file -L, --logfile PATH path to writable logfile -P, --pidfile PATH path to pidfile -V, --version Print version and exit -h, --help Show help
配置好這些東西,就能夠對剛纔寫的HardWorker進行測試了。ubuntu
須要在rails項目目錄下啓動數組
能夠經過linux cli的方式,使用添加參數來啓動sidekiq: bundle exec sidekiq -q queue_name_1,queue_name_2
也能夠將這些參數放到yml中,經過 -C 參數來啓動: bundle exec sidekiq -C config/sidekiq.yml
也能夠直接: sidekiq 或者 bundle exec sidekiq -e production-r
: 指定須要引入的那些自定義 worker 以及相關的 ruby 代碼-C
: 指定配置文件的路徑. 若是配置文件路徑爲 config/sidekiq.yml 則可忽略這個參數-e
: 指定當前的 sidekiq 以什麼環境進行運行. (控制了使用什麼配置信息)ruby
richard@richard:~/ipucc/blog$ sidekiq s ss sss sss ss s sss s ssss sss ____ _ _ _ _ s sssss ssss / ___|(_) __| | ___| | _(_) __ _ s sss \___ \| |/ _` |/ _ \ |/ / |/ _` | s sssss s ___) | | (_| | __/ <| | (_| | ss s s |____/|_|\__,_|\___|_|\_\_|\__, | s s s |_| s s sss sss
richard@richard:~/ipucc/blog$ rails c Loading development environment (Rails 4.1.1) 2.1.2 :002 > HardWorker.perform_async 'Hello World', 1 # 調用perform => "2f68a6b62418f34670b6afdc" 2.1.2 :003 >
route.rb 添加 :服務器
require 'sidekiq/web' mount Sidekiq::Web => '/sidekiq'
訪問 http://localhost:3000/sidekiq/retries 進入監控頁面
這樣,就能夠在頁面上看到sidekiq的運行狀況了。更多詳情見:sidekiq Monitoring