可以使用Rails来进行异步处理的工具是「Sidekiq」

“Sidekiq是什么?”

Sidekiq是一个用于执行异步处理的库,类似于resque或delayed_job。通过同时运行多个作业,可以节省内存。

公式仓库

side.png

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次…

bimi.png

你动了呢。

管理面板

   require 'sidekiq/web'
   mount Sidekiq::Web, at: "/sidekiq"

当要创建管理页面时,需要进行mount。当访问http://localhost:3000/sidekiq时…

sidekiq_mount.png

发布

如果使用Capistrano,为了更新在部署时由Sidekiq加载的代码,需要添加以下设置,以便在部署期间同时重新启动。

require 'capistrano/sidekiq'
set :sidekiq_role, :web

请查看Sidekiq wiki以获取详细设置信息。

广告
将在 10 秒后关闭
bannerAds