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+
use Queuety\Queuety;
Queuety::register( 'send_email', SendEmailHandler::class );
Queuety::dispatch( 'send_email', [
'to' => 'user@example.com',
'subject' => 'Welcome',
'body' => 'Hello from Queuety!',
] );実践例
PHPで定義したワークフローと、それを実行するワーカーコマンドです。
承認ワークフロー
ワークフローはステップを実行し、24時間待機した後、別のプロセスがapprovalシグナルを送るまでwait_for_approval()で一時停止します。
遅延はデータベースに保存されるため、ワーカーの再起動やデプロイ後も維持されます。シグナルが早めに送られた場合も記録され、ワークフローが待機状態に達したときに処理されます。実行をキャンセルすると、on_cancel()ハンドラーが呼び出されます。
$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' ] );# Single worker on default queue
wp queuety work
# Process a specific queue
wp queuety work --queue=emails
# Process multiple queues in priority order
wp queuety work --queue=critical,default,low
# One-shot mode
wp queuety work --once
# Multi-worker mode
wp queuety work --workers=4
# Adaptive worker pool
wp queuety work --queue=providers --min-workers=2 --max-workers=6MySQLから直接ジョブを取得
各ワーカーは長時間稼働する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のドキュメントから、簡潔に回答します。
デフォルトキューの単純なジョブなら必要ありません。WordPress cronが実行されている限り、プラグインは毎分WordPress cron経由でワンショットワーカーを起動し、1回の実行につき1つのジョブを処理します。定期スケジュール、カスタムキュー、低遅延には、専用のwp queuety workプロセスが必要です。
いいえ。mysqliまたはpdo_mysqlのどちらかが必要で、WordPressではデフォルトでmysqliが選ばれます。QUEUETY_DB_DRIVERをauto、mysqli、pdoのいずれかに設定すると、ドライバーを指定できます。
ジョブの取得にはSELECT ... FOR UPDATE SKIP LOCKEDを使用します。MySQLでは8.0以降、MariaDBでは10.6以降で利用できます。プロジェクトのCIはMySQL 8.0に対して実行されます。
はい。ジョブ、ワーカー、ワークフロー、シグナル、ステートマシン、アーティファクト、ログ、メトリクス、スケジュールを含むデータベース基盤のコアは、直接Connectionに接続して動作します。ワーカープールにはDB_HOST、DB_NAME、DB_USER、DB_PASSWORD定数も必要です。Queuety::on_action()、replace_wp_cron()、プラグインのブートストラップ、wp queuetyコマンドには、引き続きWordPressが必要です。
まだできません。Queuety::replace_wp_cron()は定期wp_schedule_event()イベントをQueuetyスケジュールに変換しますが、フックコールバックはまだ実行しません。実行が必要なイベントにはWP-Cronを使い続けてください。wp_schedule_single_event()のイベントもWP-Cronで処理されます。
wp queuety work --workers=Nは固定数のワーカープールを起動し、クラッシュした子プロセスを再起動します。実行にはpcntlとposix拡張機能が必要です。--min-workersと--max-workersを使うと、未処理ジョブが増えたときに拡張し、処理が落ち着くと縮小する適応型プールを実行できます。
プラグインをインストールしてワーカーを起動し、最初のジョブから承認ワークフローやステートマシンまで、ガイドに沿って進めましょう。