Advanced Queue

ジョブの状態管理、リトライ機能、遅延処理、Viewsを活用したジョブ一覧など、Drupal向けの改良されたQueue APIを提供します。

advancedqueue
5,654 sites
66
drupal.org

インストール

Drupal 11, 10 v8.x-1.5
composer require 'drupal/advancedqueue:8.x-1.5'
Drupal 9 v8.x-1.3
composer require 'drupal/advancedqueue:8.x-1.3'

概要

Advanced Queueは、DrupalコアのQueue APIと比較して改良されたキューAPIを提供します。プラグイン可能なバックエンドストレージを持つ設定エンティティ(Queue)と、ジョブタイプを定義するためのプラグインシステムを導入しています。

各ジョブは定義された状態(queued、processing、success、failure)を経て処理され、処理後に結果(状態、メッセージ、処理時間)を保存します。このモジュールは、設定可能な遅延を伴う自動リトライ、遅延/スケジュールされたジョブ実行、一括ジョブ作成、重複ジョブ検出をサポートしています。

Queueはcron経由またはデーモン(Drushコマンド)経由で処理できます。このモジュールは、削除、リトライ、解放などの一括操作を含む、ジョブの監視と管理のためのViews統合を備えた包括的な管理UIを提供します。

Features

  • 4つの状態によるジョブ状態追跡:queued、processing、success、failure
  • 状態、メッセージ、処理時間を含むジョブ結果の保存
  • カスタマイズ可能なリトライ遅延を伴う、ジョブタイプごとの設定可能なリトライ
  • 遅延/スケジュールされたジョブ処理 - 将来実行するジョブをスケジュール可能
  • キューストレージ用のプラグイン可能なバックエンドシステム(データベースバックエンド付属)
  • カスタムジョブプロセッサを定義するためのプラグイン可能なジョブタイプシステム
  • フィンガープリントによる重複ジョブの検出と処理
  • 効率的なエンキュー用の一括ジョブ作成API
  • シグナルハンドリング(SIGTERM/SIGINT)を備えたcronまたはDrushデーモンコマンドによる処理
  • フィルタリング、ソート、一括操作を備えたViewsによるジョブ一覧
  • 件数または日数のしきい値に基づく完了ジョブの自動クリーンアップ
  • Queue設定エンティティを作成・管理するための管理UI

Use Cases

バックグラウンドメール処理

メール送信用のジョブタイププラグインを作成します。メールを送信する必要がある場合、メールデータをペイロードとしてJobを作成しエンキューします。ジョブプロセッサがバックグラウンドでメールを送信し、SMTPが失敗した場合は自動リトライします。

スケジュールされたコンテンツ公開

将来の利用可能時間を持つジョブを作成して、コンテンツ操作をスケジュールします。エンキュー時にdelayパラメータを使用して、ジョブを処理するタイミングを設定します。

大量データ処理

一括ジョブ作成(enqueueJobs)を使用して、処理用に数千のアイテムを効率的にキューに入れます。継続的な処理のために、無制限の時間でデーモン処理を設定します。

サブスクリプション更新

Commerce Recurringと同様に、定期的な操作用のジョブタイプを作成します。一時的な支払い失敗を適切に処理するために、遅延付きリトライを設定します。

インポート/エクスポート操作

大規模なインポートまたはエクスポート操作をバックグラウンドジョブとしてキューに入れます。タイムアウトを防ぎ、複数のcron実行にわたって処理できるように処理時間制限を使用します。

APIレート制限操作

レート制限のある外部APIを呼び出す操作をキューに入れます。スロットリングにより操作が失敗した場合にレート制限を尊重するために、リトライ遅延を設定します。

Tips

  • 優先度、処理方法、またはバックエンドストレージによってジョブを分離するために、異なるキューを使用してください
  • 早期解放を防ぐために、最も長時間実行されるジョブに基づいて適切なlease_timeを設定してください
  • cronを待つべきでない時間に敏感なジョブには、デーモン処理を使用してください
  • 完了ジョブによるデータベースの肥大化を防ぐために、クリーンアップしきい値を設定してください
  • ジョブタイプでhandleDuplicateJobs()メソッドを実装して、重複処理をカスタマイズ(マージ、置換、破棄)してください
  • ジョブ完了後に通知を送信したりフォローアップアクションをトリガーするには、POST_PROCESSイベントを使用してください
  • 本番サイトでは、並列処理のために複数のDrushデーモンプロセスの実行を検討してください

Technical Details

Admin Pages 4
Queues /admin/config/system/queues

すべてのキュー設定エンティティを一覧表示するメイン管理ページ。各キューのラベル、状態別ジョブ数(Queued、Processing、Success、Failure)、操作リンク(編集、削除、ジョブ一覧)が表示されます。すべてのキューと現在のジョブ統計の概要を提供します。

キューを追加 /admin/config/system/queues/add

バックエンド選択と処理オプションを備えた新しいキュー設定エンティティを作成するためのフォーム。

キューを編集 /admin/config/system/queues/manage/{queue_id}

既存のキュー設定を編集するためのフォーム。バックエンドは作成後に変更できません。

ジョブ /admin/config/system/queues/{queue_id}/jobs

特定のキュー内のすべてのジョブをViewsで一覧表示。ID、リトライ回数、状態(アイコン付き)、タイプ、ペイロード(JSON)、利用可能日、処理日、メッセージ、操作などのジョブ詳細が表示されます。状態とジョブタイプによるフィルタリング、ソート、ページネーション(1ページ50件)、一括操作をサポートしています。

権限 1
キューを管理

キューの作成、編集、削除、およびジョブの管理を許可します。これは制限付きアクセス権限であり、信頼できる管理者にのみ付与してください。

Hooks 2
hook_advancedqueue_backend_info_alter

モジュールがバックエンドプラグインの定義を変更できるようにします

hook_advancedqueue_job_type_info_alter

モジュールがジョブタイププラグインの定義を変更できるようにします

Drush Commands 2
advancedqueue:queue:process <queue_id>

特定のキューからジョブを処理します。コマンドはタイムアウトに達するか、キューが空になるまで(stop_when_emptyが有効な場合)ジョブを処理します。SIGTERMおよびSIGINTシグナルによるグレースフルシャットダウンをサポートしています。

advancedqueue:queue:list

設定されたすべてのキューと状態別ジョブ数を一覧表示します。

Troubleshooting 4
ジョブが'processing'状態のまま止まっている

これはワーカーがクラッシュまたはタイムアウトした場合に発生します。ジョブはリース時間(デフォルト300秒)の経過後に自動的に解放されます。管理UIまたは一括操作から手動でジョブを解放することもできます。

cron中にキューが処理されない

キューのプロセッサが'Cron'(デーモンではなく)に設定されていることを確認してください。cronが実行されていることと、processing_timeがcron間隔に対して適切であることを確認してください。

重複ジョブが作成される

ジョブタイププラグインのallow_duplicatesがFALSEに設定されていることを確認してください。バックエンドはSupportsDetectingDuplicateJobsInterfaceを実装している必要があります(データベースバックエンドは実装済み)。デフォルトのフィンガープリントロジックがニーズに合わない場合は、ジョブタイプでcreateJobFingerprint()をオーバーライドしてください。

ジョブがリトライなしですぐに失敗する

リトライは、ジョブタイプのprocess()メソッドがJobResult::failure()を返した場合にのみ発生します。処理中の例外はリトライなしで即座に失敗を引き起こします。ジョブタイププラグインのアノテーション/アトリビュートでmax_retriesを設定してください。

Security Notes 3
  • 'administer advancedqueue'権限は制限付きアクセスとしてマークされており、信頼できる管理者にのみ付与してください
  • ジョブペイロードはJSONブロブとして保存されます - 機密データをペイロードに直接保存することは避けてください
  • インジェクション攻撃を防ぐために、処理前にジョブペイロード内のデータを検証およびサニタイズしてください