概要
前回 Sidekiq に入門してみました
今回は Sinatra と組み合わせてみました
環境
- macOS 10.13.2
- Ruby 2.4.1p111
- Redis 3.2.1
- sidekiq 5.1.3
- sinatra 2.0.1
ワーカー
基本的には前回と同じです
- vim worker.rb
require 'sidekiq'
Sidekiq.configure_server do |config|
config.redis = { 'db' => 1 }
end
class MyWorker
include Sidekiq::Worker
def perform(complexity)
case complexity
when 'super_hard'
sleep 20
puts 'super_hard'
when 'hard'
sleep 10
puts 'hard'
else
sleep 1
puts 'easy'
end
end
end
bundle exec sidekiq -r ./worker.rb -P ./tmp/sidekiq.pid
とりあえず起動しておきましょう
アプリ
普通の Sinatra アプリに enqueue する処理をいれるだけです
require 'sinatra/base'
require './worker.rb'
Sidekiq.configure_client do |config|
config.redis = { 'db' => 1 }
end
class MyApp < Sinatra::Base
get '/enqueue/:value' do
MyWorker.perform_async(params['value'])
"enqueue #{params['value']}"
end
end
bundle exec rackup config.ru
動作確認
curl 'localhost:9292/enqueue/super_hard'
curl 'localhost:9292/enqueue/hard'
curl 'localhost:9292/enqueue/easy'
と実行してみましょう
すぐにレスポンスが返ってくると思います
そしてワーカーのログを確認するとちゃんと非同期処理が実行されていることが確認できると思います
easy
2018-04-04T09:20:43.050Z 5683 TID-ovxtvzpkn MyWorker JID-170aa25c66fcdafb78e7c049 INFO: done: 1.001 sec
hard
2018-04-04T09:20:49.878Z 5683 TID-ovxtw03kf MyWorker JID-22663fbd98445bde4119a4d1 INFO: done: 10.006 sec
super_hard
2018-04-04T09:20:57.103Z 5683 TID-ovxtvzpbn MyWorker JID-895bd0adfb849652c0860eae INFO: done: 20.005 sec
最後に
Sinatra + Sidekiq で超かんたんな非同期 Web アプリを作成してみました
処理も切り離せて管理もしやすいと思います
サービスにする場合はちゃんとキューの状態などを追える仕組みを考えないとダメだと思います
0 件のコメント:
コメントを投稿