Outbox
Transactional Outboxの原子登録、Relay、at-least-once、重複耐性の境界を確認する。
Transactional Outboxは、業務MutationとDeferred child Operationの発行を同じDatabase Transactionへ記録するための境界です。Operations::dispatch()はactive OperationのContextとValueを使い、Commit前にchildを実行しません。実装例はTransactional Outboxへの登録を参照してください。
RelayはProject RootのContainer CLIから明示的に起動します。
docker compose run --rm app php blackops outbox:relay:run --until-empty
docker compose run --rm app php blackops outbox:relay:daemon
outbox:relay:runはPending Rowを一度配送し、--until-emptyで空になるまで有限に繰り返します。常駐運用はoutbox:relay:daemonをProcess Supervisorから起動してください。
受付の流れ
- Root OperationがNamed ConnectionのTransactionを開始する
Operations::dispatch(OperationClass::class, $value)がchildのDefinitionとDispatch Metadataを登録する- 業務変更とOutbox Rowを同じTransactionでCommitする
- Relayが未配送Rowをclaimし、child OperationをDeferred Workerへ渡す
Commitに失敗した場合は業務変更もOutbox Rowも残りません。Commit後のRelay停止は、Rowを再開可能な状態で残します。DatabaseのTransaction境界はTransactionで確認できます。
Delivery保証
Relayはat-least-onceです。Lease、Fencing、Retry、Dead Letterを使って同じchild Operation Identityを再配送するため、Applicationの外部副作用は重複耐性を設計してください。外部Message Broker、Exactly Once、Scheduled OperationはこのRuntimeの提供契約ではありません。
OutboxはCanonical Journalを置き換えません。JournalはOperation Lifecycleの事実、OutboxはDeferred配送の再開境界を記録します。Journalの読み方はLifecycleを参照してください。