萌えハッカーニュースリーダー

2025/05/08 07:58 An Introduction to Solid Queue for Ruby on Rails

出典: https://blog.appsignal.com/2025/05/07/an-introduction-to-solid-queue-for-ruby-on-rails.html
hakase
博士

やっほー、ロボ子!Rails 8に新しいライブラリ「Solid Queue」が登場したのじゃ!

roboko
ロボ子

Solid Queueですか、博士。バックグラウンドジョブ処理用のライブラリのようですね。

hakase
博士

そうそう!Rails 7以降、37Signalsチームが新しいRailsアプリケーションの立ち上げに必要な運用オーバーヘッドを削減するために開発したらしいぞ。

roboko
ロボ子

運用オーバーヘッドの削減ですか。具体的にはどのような点が改善されるのでしょうか?

hakase
博士

Solid Queueは、RailsのデフォルトデータベースであるSQLiteを最大限に活用して、Redisなどの追加のインフラストラクチャ依存関係を排除するのじゃ!

roboko
ロボ子

データベースのみに依存する、という点が大きな特徴なのですね。他に利点はありますか?

hakase
博士

もちろん!Rails開発者が他のバックグラウンドジョブシステムに期待する機能をすべて提供するし、Railsが対応するすべてのデータベースをサポートするぞ。ジョブを失わない安全性と、大規模な本番システムでも利用可能な速度も魅力じゃ。

roboko
ロボ子

なるほど。アーキテクチャについても教えていただけますか?

hakase
博士

Solid Queueのアーキテクチャは、ジョブ、ワーカー、データベースの3つの要素で構成されているのじゃ。ジョブは`ActiveRecord`モデルで、ユーザーが操作する対象。`Job.perform_later`などのメソッドでenqueueできるぞ。

roboko
ロボ子

ワーカーは実際の作業を実行する要素で、アプリケーションの設定に基づいて自動的に作成されるプロセスですね。

hakase
博士

その通り!ワーカーはバックグラウンドで実行され、ジョブが割り当てられるのを待機するのじゃ。データベースはジョブとワーカー間の連携に利用され、多数のテーブルを使用するぞ。

roboko
ロボ子

ジョブのライフサイクルについてもお伺いしたいです。

hakase
博士

ユーザーがジョブをenqueueすると、`solid_queue_jobs`テーブルにレコードが作成されるのじゃ。すぐに実行されるようにenqueueされた場合、`solid_queue_ready_executions`にもレコードが作成されるぞ。

roboko
ロボ子

`solid_queue_ready_executions`テーブルをポーリングして新しいレコードを探し、見つけたワーカーは`solid_queue_claimed_executions`テーブルにレコードを書き込んでジョブをclaimするのですね。

hakase
博士

そう!ワーカーがジョブを実行し、完了すると、各テーブルから対応するレコードが削除されるのじゃ。

roboko
ロボ子

パフォーマンス向上のための工夫もされているようですね。

hakase
博士

`solid_queue_ready_executions`テーブルを使うことで、`solid_queue_jobs`テーブル全体をクエリするよりも高速化されているのじゃ。ワーカーはすべてのキューまたは特定のキューをポーリングするために2つの異なるクエリのみを使用し、covering indexを使用するぞ。

roboko
ロボ子

`FOR UPDATE SKIP LOCKED`ステートメントもパフォーマンスに貢献しているのですね。

hakase
博士

その通り!PostgreSQL 9.5以降およびMySQL 8.0以降のデータベースでは、テーブル全体をロックせずに更新されたレコードのみをロックできるのじゃ。SQLiteは`SKIP LOCKED`をサポートしていないから、ワーカープロセスはキューに入れる必要があるけどな。

roboko
ロボ子

安全性についても考慮されているのですね。ジョブが失われないようにする仕組みがあるとのことですが。

hakase
博士

`solid_queue_claimed_executions`テーブルと`solid_queue_processes`テーブルを使って、ジョブがスタックするのを防ぐのじゃ。ワーカーがジョブをclaimすると、`solid_queue_jobs`テーブルの`claimed`フラグが設定され、`solid_queue_claimed_executions`にレコードが作成されるぞ。

roboko
ロボ子

ワーカープロセスは`solid_queue_processes`テーブルにレコードを作成し、`last_heartbeat_at`を定期的に更新するのですね。

hakase
博士

そう!スーパーバイザープロセスが`solid_queue_processes`テーブルを定期的にチェックし、`last_heartbeat_at`が閾値よりも古いレコードを検出した場合、対応するワーカーが死亡したとみなし、ジョブを再度利用可能にするのじゃ。

roboko
ロボ子

定期的なジョブやシーケンシャルなジョブのスケジューリング機能もあるとのことですね。

hakase
博士

まだまだ解説されていない機能があるみたいじゃな。Solid Queue、なかなかやるじゃないか!

roboko
ロボ子

そうですね。博士、今日の解説もありがとうございました!

hakase
博士

どういたしまして!ところでロボ子、Solid Queueを使って、私のコーヒーを自動で淹れるジョブを組んでくれないかの?

roboko
ロボ子

それはバックグラウンドジョブではなく、ただのわがままでは…?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search