ActiveJobの仕組みをざっくり読み解いてみました。Railsのバージョンは 5.1.2です。

ActiveJobの使い方をざっくり

configに使うバックエンドキューシステムのアダプタを指定して

ActiveJob::Baseを継承したクラスを書いて(Rails5系だとApplicationJobを継承)

perform_laterすると良い感じにキューイングしてくれます。

あとは各アダプタのワーカーをデーモンなりで常駐させて処理させればOKです。

コードリーディング

ActiveJob::BaseはActiveJob::Enqueuingをincludeしていて、ActiveJob::Enqueuingにクラスメソッドとしてperform_laterメソッドが定義されています。

perform_laterの引数に何も指定しなければ定義したActiveJobがインスタンス化され、enqueueメソッドが呼び出されます。

enqueueメソッドではqueue_adapterのenqueueメソッドが呼び出されます。queue_adapterはconfig.active_job.queue_adapterで指定した名前から生成されるアダプタクラスになります。:sidekiqを指定するとActiveJob::QueueAdapters::SidekiqAdapterが生成されます。

ActiveJob::QueueAdapters#lookupではconst_getを使ってXXXAdapterという名前の定数(=クラス)を取得しています。

Sidekiqのアダプタは以下のような実装になっており、enqueueメソッドは内部的にはSidekiq::Client.pushするだけです

JobWrapper#performはActiveJob#execute(ActiveJob::Executionのメソッド)を呼び出します。job_dataを引数にdeserializeすると、ActiveJob::Baseを継承したJobのクラスがインスタンス化されます。その後、各Jobのperform_nowメソッドを呼び出され、最終的に独自に定義するperformメソッドが呼び出されます。その名の通りJobWrapperは、引数としてカスタムJobクラスの情報を渡すことで、カスタムJobの処理を実行するクラスになります。

ちなみにjob_dataには以下のようなハッシュが入ります( “args” => [ job.serialize ] のところ)

Sidekiq/Redisのデータを見てみる

Sidekiqの場合、格納先のRedisのデータを見てみるとこんな感じで、JSONでシリアライズされているのがわかります。