ワークフローの制約
ワークフロークラスは、時間とともに変わる外部状態やサービスに依存できません。現在日時、現在のユーザー、外部ネットワークリソースなど、変化しうる情報を直接使わないでください。
ワークフロー内では次の操作を避けます。
- 現在日時を読む
Carbon::now()は、呼び出すたびに値が変わります。Workflow\V2\Workflow::now()またはWorkflow\V2\now()を使うと、リプレイに安全なワークフロー時刻を得られます。 - 現在のユーザーを読む
Auth::user()は、ログイン中のユーザーに依存します。開始時にユーザーを入力として渡してください。 - 外部ネットワークへの直接リクエストは、応答、速度、可用性が変化します。必要なデータを開始時の入力に渡すか、アクティビティで取得してください。
sideEffectに結果を記録する場合を除き、乱数生成器などのランダムな値を使わないでください。必要な値を開始時の入力に渡す方法もあります。
起動時のチェック
workflows.v2.types.workflows に登録したクラスは、アプリ起動時にスキャンされます。Carbon::now()、Auth::user()、DB::、Http::、random_int() など、明らかにリプレイに安全でない呼び出しを検出します。workflows.v2.guardrails.boot で対応を指定します。
| モード | 動作 |
|---|---|
warn(既定) | 検出ごとに警告を記録し、アプリの起動を妨げません。 |
silent | 起動時スキャンを省略します。 |
throw | 最初の検出で LogicException を投げます。CI に適しています。 |
// config/workflows.php
'v2' => [
'guardrails' => [
'boot' => env('DW_V2_GUARDRAILS_BOOT', 'warn'),
],
],
CI では DW_V2_GUARDRAILS_BOOT=throw にして、安全でないリプレイ呼び出しの追加を拒否します。本番では warn を使い、未検出の問題がデプロイを停止させないようにします。
初回リリースでは、起動時スキャンだけがワークフローをブロックできる決定性チェックです。ランタイムはワークフロータスクの取得時に決定性診断を再実行しません。2.0 では、ローカルに登録した PHP ワークフローをデプロイ前に検査し、長期間実行中の定義フィンガープリントの変化は Waterline に表示します。異なるビルド間のタスク取得が、新たなデプロイ障害の原因になるのを避けています。
フィンガープリント記録以前の実行にも、保守的な方針を適用します。新しい getVersion() 分岐に到達した実行の WorkflowStarted 履歴がフィンガープリントのスナップショットより古い場合、ランタイムは WorkflowStub::DEFAULT_VERSION を維持します。現在の定義で安全にリプレイできるとは仮定しません。バージョン管理を参照してください。