sidekiqを使ってみた個人メモ

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

sidekiq使ったことなかったので使ってみました。
http://sidekiq.org/

sinatraでpostからパラメータ受け取って、バックエンドのqueueに重い処理を流すみたいな事をしたいなと思って調べたメモです。
今回はダミーの処理として、数秒sleep後にPOSTで受け取ったパラメータをキーとしてバリューにtrueを入れるような処理にしています。

検証用に書いたコードはここに置きました
https://github.com/ara-ta3/sinatra-and-sidekiq

Web Appの準備

sinatra + unicornでwebアプリケーションを書きます
ファイル構成はこんな感じです

$tree
.
├── Gemfile
├── Gemfile.lock
├── Makefile
├── Worker.rb
├── app.rb
├── config.ru
├── log
│   ├── unicorn.stderr.log
│   └── unicorn.stdout.log
└── unicorn.rb

1 directory, 9 files

Gemfile

source "https://rubygems.org"

gem "sinatra"
gem "unicorn"
gem "sidekiq"
gem "redis"

app.rb

require "sinatra"
require "json"
require "redis"

class App < Sinatra::Base

    @@redis = Redis.new(:url => "redis://localhost/10")
    get '/' do
        content_type :json
        all = {}
        @@redis.keys.each {|k| 
            all[k] = @@redis.get(k)
        }
        all.to_json
    end

    post '/' do
        d = params[:x]
        # とても重い処理をバックエンドのQueueに任せる
        Worker.perform_async(d)
        content_type :json
        res = {
            result: "ok"
        }
        res.to_json
    end
end

config.ru

require "./app.rb"
require "./Worker.rb"
require "sidekiq"
require 'sidekiq/web'

Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'sidekiq' }
end

run Rack::URLMap.new('/' => App, '/sidekiq' => Sidekiq::Web)

unicorn.rb

@dir = "./"

worker_processes 2
working_directory @dir

timeout 300
listen 8081

stderr_path "#{@dir}log/unicorn.stderr.log"
stdout_path "#{@dir}log/unicorn.stdout.log"

起動コマンド

$bundle exec unicorn -c unicorn.rb
...

#別ターミナルで
$curl -i localhost:8081
HTTP/1.1 200 OK
Date: Mon, 19 Sep 2016 09:43:35 GMT
Connection: close
Content-Type: application/json
Content-Length: 2
X-Content-Type-Options: nosniff

{}%

# ダミーの重い処理を起動するコマンド
# workerを動かしていないので処理されませんがこの実行後にキューにメッセージが溜まる感じです
$curl -i -X POST localhost:8081 -d 'x=hoge'
HTTP/1.1 200 OK
Date: Mon, 19 Sep 2016 09:43:38 GMT
Connection: close
Content-Type: application/json
Content-Length: 15
X-Content-Type-Options: nosniff

{"result":"ok"}%

$cat log/unicorn.stderr.log
I, [2016-09-19T18:39:36.673794 #41193]  INFO -- : listening on addr=0.0.0.0:8081 fd=9
I, [2016-09-19T18:39:36.673899 #41193]  INFO -- : worker=0 spawning...
I, [2016-09-19T18:39:36.674996 #41193]  INFO -- : worker=1 spawning...
I, [2016-09-19T18:39:36.675474 #41193]  INFO -- : master process ready
I, [2016-09-19T18:39:36.676282 #41194]  INFO -- : worker=0 spawned pid=41194
I, [2016-09-19T18:39:36.676482 #41195]  INFO -- : worker=1 spawned pid=41195
I, [2016-09-19T18:39:36.676773 #41194]  INFO -- : Refreshing Gem list
I, [2016-09-19T18:39:36.676799 #41195]  INFO -- : Refreshing Gem list
I, [2016-09-19T18:39:36.806327 #41194]  INFO -- : worker=0 ready
I, [2016-09-19T18:39:36.806394 #41195]  INFO -- : worker=1 ready
127.0.0.1 - - [19/Sep/2016:18:39:39 +0900] "GET / HTTP/1.1" 200 2 0.0081
127.0.0.1 - - [19/Sep/2016:18:39:40 +0900] "POST / HTTP/1.1" 200 15 0.0089
I, [2016-09-19T18:39:42.898632 #41193]  INFO -- : reaped #<Process::Status: pid 41195 exit 0> worker=1
I, [2016-09-19T18:39:42.898718 #41193]  INFO -- : reaped #<Process::Status: pid 41194 exit 0> worker=0
I, [2016-09-19T18:39:42.898984 #41193]  INFO -- : master complete

ついでにsidekiqのWeb UIもあるらしく、追加してみました。
localhost:8081/sidekiq/ にアクセスすると見れます。
localhost:8081/sidekiq だと見れないので注意です。

スクリーンショット 2016-09-19 18.46.26.png

便利そう

Workerの準備

worker側は実装書いて実行するだけです。

Worker.rb

require "redis"
require "sidekiq"

class Worker
    include Sidekiq::Worker
    sidekiq_options queue: :event
    @@redis = Redis.new(:url => "redis://localhost/10")

    def perform(key)
        sleep(2)
        # ほんとは重いSQLを発行したりしてMySQLに書き込んだりするものを想定
        @@redis.set(key, true)
    end
end

後は実行だけです。
ログに処理結果が流れたりするのでわかりやすいです。

$bundle exec sidekiq -r ./Worker.rb -q event


         m,
         `$b
    .ss,  $$:         .,d$
    `$$P,d$P'    .,md$P"'
     ,$$$$$bmmd$$$P^'
   .d$$$$$$$$$$P'
   $$^' `"^$$$'       ____  _     _      _    _
   $:     ,$$:       / ___|(_) __| | ___| | _(_) __ _
   `b     :$$        \___ \| |/ _` |/ _ \ |/ / |/ _` |
          $$:         ___) | | (_| |  __/   <| | (_| |
          $$         |____/|_|\__,_|\___|_|\_\_|\__, |
        .d$$                                       |_|

2016-09-19T09:52:15.738Z 41994 TID-owno79hy0 INFO: Running in ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
2016-09-19T09:52:15.738Z 41994 TID-owno79hy0 INFO: See LICENSE and the LGPL-3.0 for licensing details.
2016-09-19T09:52:15.738Z 41994 TID-owno79hy0 INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2016-09-19T09:52:15.738Z 41994 TID-owno79hy0 INFO: Booting Sidekiq 4.2.1 with redis options {:url=>nil}
2016-09-19T09:52:15.751Z 41994 TID-owno79hy0 INFO: Starting processing, hit Ctrl-C to stop
2016-09-19T09:52:16.154Z 41994 TID-owno4qck0 Worker JID-a8ac5c4dfe50040b51b8a825 INFO: start
2016-09-19T09:52:16.156Z 41994 TID-owno4qamk Worker JID-c369a462be8d818d9d13b4e5 INFO: start
2016-09-19T09:52:16.157Z 41994 TID-owno4qawk Worker JID-ef961372d2ac86b215db3d07 INFO: start
2016-09-19T09:52:18.160Z 41994 TID-owno4qck0 Worker JID-a8ac5c4dfe50040b51b8a825 INFO: done: 2.006 sec
2016-09-19T09:52:18.160Z 41994 TID-owno4qamk Worker JID-c369a462be8d818d9d13b4e5 INFO: done: 2.004 sec
2016-09-19T09:52:18.160Z 41994 TID-owno4qawk Worker JID-ef961372d2ac86b215db3d07 INFO: done: 2.004 sec

まとめ

  • sidekiq便利そう
  • UIきれい