1. joaoki0412

    Posted

    joaoki0412
Changes in title
+Active JobとSidekiqについて
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,84 @@
+# これは何?
+Rails 4.2以降で標準で利用可能になったのがActive Job。
+バックグラウンドでジョブを実行するために利用するという理解はしてるけど、実は全然理解できていない人向けです。
+
+
+# Active Jobって何?
+Railsガイドによると、下記のように記載があります。
+
+`Active Job is a new framework in Rails 4.2. It is a common interface on top of queuing systems like Resque, Delayed Job, Sidekiq, and more.`
+
+そのため、実際にバックグラウンドでジョブを実行できるものではなく、
+あくまでバックグラウンドでジョブを実行するgemの共通インターフェースになってるようです。
+※ Active Job単体ではキューを実現できないようです。
+
+要は、Active JobがキューにJobを登録して、SidekiqのようなgemがJobを実際に実行するイメージです。
+
+# サンプルコード
+## 作成イメージ
+下記のようなイメージでコードを作成していきます。
+
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/180679/0de61bfc-9d0f-293c-7373-d5b5d8b60336.png)
+
+ControllerからRedisにジョブが登録されると、
+ActiveJobをインターフェースとしたSidekiqが常にRedisを監視して新規登録があればジョブを実行するという流れ。
+
+## 詳細
+`redis`と `sidekiq`は入れておいてください。
+`brew install redis`
+`gem sidekiq`
+
+```config/sidekiq.yml
+:concurrency: 25
+:pidfile: ./tmp/pids/sidekiq.pid
+:logfile: ./log/sidekiq.log
+:queues:
+ - default
+```
+=> concurrencyは同時実行数だが、[sidekiq自身で一つカウント](https://repl.info/archives/659/)するらしい。
+
+```config/application.rb
+# ActiveJobがSidekiqを使うことを宣言
+config.active_job.queue_adapter = :sidekiq
+```
+
+```shell:bash
+bundle exec rails g job My
+```
+
+```ruby:my_job.rb
+queue_as :default
+
+def perform(message)
+ # ジョブの実行時刻を記録します
+ p Time.now
+end
+```
+
+```ruby:start_controller.rb
+# CSRF対策がされてるので、その回避のため
+protect_from_forgery :except => [:run]
+
+def run
+ # 即時実行
+ MyJob.perform_later('Task execute')
+ # 時間置き実行
+ MyJob.set(wait: 3.second).perform_later('Task execute')
+
+ render plain: 'success'
+end
+```
+
+```ruby:routes.rb
+post 'start/run'
+```
+
+これで準備おけいです。
+
+あとは、Redisの起動、Railsの起動、sidekiqの起動をして、リクエストを投げればsidekiq上で時刻が表示されると思います。
+
+[ほぼこちら](https://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_active-job-sidekiq/)のコードで勉強させてもらいました。ありがとうございます。
+
+# リトライ制御
+ActiveJobはリトライ制御が弱いらしいです。
+WIP