Solid Queue
https://dev.37signals.com/introducing-solid-queue/
37signalsが開発した、DBをバックエンドとするキューライブラリgem
抱えていた課題
RedisとResqueを使ってきたが、要件を満たすにはpluginを含めて7つもgemをインストールする必要がありシンプルとは言い難い状況
Solid Cacheの経験を踏まえてDBをキューとして使うことを検討し始めた
古くはDelayed Jobと同じ、近年ではPostgreSQL専用のGoodJobがあり、RailsコアとするためにはMySQL, PostgreSQL, SQLiteをサポートする必要がある
速度のためにRedisを使用していたのでは?
システムが適切に設計されていればDBでも十分な性能を出せる
適切な設計とは
必要だったのはFOR UPDATE SKIP LOCKED
Solid Queue のワーカーは他ワーカーをロックせずにジョブをフェッチしてロックできる
処理中のジョブ、今後スケジュールされるのを待っているジョブ、失敗して手動介入が必要なジョブ、または同時実行制限のためにブロックされたジョブが、実行準備ができているジョブから分離する
selectではカバリングインデックスを利用し、ノンブロッキングで高速に動作する名前付きキュー、優先度付きキューを実現
現在、毎日約 560 万件のジョブが実行されており、平均クエリ時間は 110 μs、クエリあたり 0.02 行の検査で、1 秒あたり約 1,300 件のポーリング クエリを実行しています。
ActiveRecordインタフェースでジョブを扱えることで操作がシンプルになり、デバグも容易になった
2024-09 v1.0
https://dev.37signals.com/solid-queue-v1-0/
HEYではSolid Queue専用のDBを立てている
事例
SolidQueue解体新書