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)