コンテンツへスキップ

Queuety

WordPressワークフローエンジン。

ターミナル
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate

最新リリース v0.22.0 GPL-2.0-or-later WordPress 6.4+, PHP 8.2+

実践例

PHPで定義したワークフローと、それを実行するワーカーコマンドです。

承認ワークフロー

ワークフローはステップを実行し、24時間待機した後、別のプロセスがapprovalシグナルを送るまでwait_for_approval()で一時停止します。

遅延はデータベースに保存されるため、ワーカーの再起動やデプロイ後も維持されます。シグナルが早めに送られた場合も記録され、ワークフローが待機状態に達したときに処理されます。実行をキャンセルすると、on_cancel()ハンドラーが呼び出されます。

PHP
$workflow_id = Queuety::workflow( 'approval_flow' )
    ->then( SubmitRequestHandler::class )
    ->delay( hours: 24 )
    ->wait_for_approval()
    ->then( ProcessApprovalHandler::class )
    ->on_cancel( CleanupHandler::class )
    ->dispatch( [ 'request_id' => 99 ] );

// Later, from another process:
Queuety::signal( $workflow_id, 'approval', [ 'approved_by' => 'admin@example.com' ] );

MySQLから直接ジョブを取得

各ワーカーは長時間稼働するWP-CLIプロセスとして動作し、FOR UPDATE SKIP LOCKEDを使ってMySQLから直接ジョブを取得します。

耐久性の高いワークフロー

永続状態を持つ複数ステップの処理は、PHPのタイムアウト、クラッシュ、再試行を乗り越えて継続します。

状態マシン

Queuety::machine()を備えた、長時間稼働するイベント駆動型の状態管理。状態と遷移を定義し、イベントを送信して、タイムラインを確認できます。

シグナルと承認

wait_for_signal()、wait_for_approval()、wait_for_input()は、外部入力が届くまでワークフローを一時停止します。

優先度レベル

「低」から「緊急」までの4段階です。同じキューでは、優先度の高いジョブから取得されます。

レート制限

スライディングウィンドウによるハンドラーごとの制限です。レート制限対象のジョブを取得したワーカーは、そのジョブをキューに戻して待機します。

定期実行ジョブ

間隔ベースおよびcronベースのスケジューリングに対応しています。外部依存関係のないcronパーサーを内蔵しています。

並列ステップ

ワークフローの各ステップを並行して実行し、すべて完了してから次へ進みます。

メトリクスとログ

ハンドラーごとのスループット、平均処理時間、p95処理時間、エラー率を永続的なデータベースログに記録します。

WP-Cronのフォールバック

シェルにアクセスできない場合、毎分実行されるWordPress cronイベントが、デフォルトキューのワンショットワーカーを起動します。

ミドルウェア

レート制限、例外のスロットリング、一意性、タイムアウト、重複実行の防止に対応する、オニオン型のジョブミドルウェアです。

PHP 8.2+

列挙型、readonlyクラス、match式、コンストラクタープロモーション、PHP属性に対応します。

Queuetyを選ぶ理由

状態はMySQLに保存

キュー行、ワークフローの状態、ログ、シグナル、ストリーミングされたチャンクはMySQLに保存されるため、ワーカーを再起動してもオーケストレーションの状態は失われません。各ステップの境界で、状態の更新、ジョブの完了、次のジョブの登録が1つのトランザクション内でコミットされます。

ページリクエストとは別に実行

WP-Cronはページへのアクセス時にしか実行されず、60秒かかるLLM呼び出しは30秒のPHPタイムアウトで終了させられます。Queuetyワーカーは長時間実行されるWP-CLIプロセスで動作し、アクセスを待たずに処理を開始します。

エージェント実行のガードレール

クォーラムモードを備えたfor_each()、承認ゲート、max_transitions()やmax_state_bytes()などの制限により、長時間のエージェント実行を定められた範囲内に保ちます。

WordPress外でも利用可能

データベースを基盤とするコアは、同じデータベースを開ける任意のPHPプロセスで動作するため、別のアプリからジョブのディスパッチ、シグナルの送信、ワークフロー状態の読み取りができます。アクショントリガー、WP-Cronブリッジ、WP-CLIコマンドには、引き続きWordPressが必要です。

との比較

Queuetyと、WordPressの開発者におなじみのスケジューラーやワークフローエンジンとの関係を説明します。

他のツールとQueuetyの比較
WP-Cron 得意なことWordPressに組み込まれているため、共有ホスティングでもシステムスケジューラーへのアクセスは不要です。実行時刻を逃したタスクも破棄されず、次のページ読み込み時に実行されます。 Queuetyとの違いQueuetyのワーカーはサイトのトラフィックとは独立して動作し、長時間実行されるwp queuety workプロセスが必要です。そのWP-Cronブリッジは定期イベントをスケジュールに変換しますが、フックコールバックはまだ実行しないため、引き続きWP-Cronが管理します。
Action Scheduler 得意なことサーバーへのアクセスなしでプラグインやテーマに組み込めるよう設計されています。WooCommerceのSubscriptionsの支払いを毎月数百万件処理し、Webhookにも対応。すべてのアクションを管理画面に記録します。 Queuetyとの違いAction Schedulerは、遅延do_action()のように、後でフックを実行します。Queuetyは、ステップ間で状態が維持される複数ステップのワークフロー、シグナルや承認待ち、ステートマシンを追加し、wp queuety workflow timelineなどのWP-CLIコマンドから確認できます。
Temporal 得意なこと永続的な実行プラットフォームです。イベント履歴にワークフローの各ステップが記録されるため、クラッシュや障害の後も最後に記録されたイベントから実行を再開できます。サービスを自分でホストする代わりにTemporal Cloudを利用することもできます。 Queuetyとの違いTemporal Serviceは、アプリケーションと並行して動作するGoサーバーとデータベースで構成されます。QueuetyはWordPressデータベース接続のMySQLテーブルに状態を保存し、WP-CLI経由でワーカーを実行します。

質問と回答

Queuetyのドキュメントから、簡潔に回答します。

プラグインをインストールしてワーカーを起動し、最初のジョブから承認ワークフローやステートマシンまで、ガイドに沿って進めましょう。