可以使用Rails来进行异步处理的工具是「Sidekiq」
“Sidekiq是什么?”
Sidekiq是一个用于执行异步处理的库,类似于resque或delayed_job。通过同时运行多个作业,可以节省内存。
公式仓库
Sidekiq (Sidekiq 一个选项)
安装 Redis。
安装 Sidekiq 时需要安装 Redis,因为 Redis 是后台(作业管理)所必需的。
# Homebrewを利用してインストール(Mac)
$ brew install redis
# yumでインストール(CentOS)
$ yum install redis
请参考这篇文章来安装Redis。
→ Redis服务器建设备忘录
→ 在Mac上安装Redis
安装Sidekiq
gem 'sidekiq'
gem 'sinatra', require: false # ダッシュボードを利用するため
$ bundle install --path vendor/bundle
进行 gem 的安装。
启动时的设置
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end
我将添加两种类型的设置:服务器端和客户端。
设置
:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 10
:queues:
- default
- test
进行Worker的实现
class TestWorker < ApplicationController
include Sidekiq::Worker
sidekiq_options queue: :test, retry: 5
def perform(title)
p 'work: title=' + title
end
end
sidekiq_options的queue可以为除了default之外的名称,并且我们这次选择了名为test的队列名称。如果不写任何内容,将默认为default作为队列名称。
如果不想重新尝试,请写上 retry: false。异步处理的类要包含 Sidekiq::Worker 并进行创建。我在 perform 中写下了想要以异步方式执行的操作。
叫喊
def show
TestWorker.perform_async('美味礼賛')
end
我已经在控制器端进行了描述。
启动命令
读取并启动以下所述的配置文件。
$ bundle exec sidekiq -C config/sidekiq.yml
在后台运行时,请使用这个选项。
$ bundle exec sidekiq -C config/sidekiq.yml -d
我启动了Sidekiq,并在后台运行。我试着连续访问了5次…
你动了呢。
管理面板
require 'sidekiq/web'
mount Sidekiq::Web, at: "/sidekiq"
当要创建管理页面时,需要进行mount。当访问http://localhost:3000/sidekiq时…
发布
如果使用Capistrano,为了更新在部署时由Sidekiq加载的代码,需要添加以下设置,以便在部署期间同时重新启动。
require 'capistrano/sidekiq'
set :sidekiq_role, :web
请查看Sidekiq wiki以获取详细设置信息。