当前位置: 首页 > 工具软件 > Sidekiq > 使用案例 >

Sidekiq异步任务

宰父淳
2023-12-01

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)

 类似资料: