Lifecycle
Operationの受付から完了、拒否、再試行、失敗までのLifecycleを理解する。
BlackOpsはInlineとDeferredを同じLifecycle Modelで記録します。ApplicationはOperation IDを相関Keyとして受付からTerminal Stateまで追跡できます。Outcome RecordはDeferred完了時だけ保存し、Inline OutcomeはHTTP Responseだけへ返します。
共通Lifecycle
正常完了するOperationはReceived、Running、Finalizing、Completedの順に進みます。DeferredだけはDurable受付後にAcceptedを経由します。
| 経路 | 状態遷移 |
|---|---|
| Inline成功 | Received → Running → Finalizing → Completed |
| Deferred成功 | Received → Accepted → Running → Finalizing → Completed |
| 業務拒否 | ReceivedまたはRunning → Rejected |
| Retry | Running → Supervising → Retry Scheduled → Running |
| 最終失敗 | Running → Supervising → Failed |
| Deferred隔離 | Running → Supervising → Dead Letter |
InlineはAcceptedを通らず、Request内でAttemptを開始します。DeferredだけがDurable受付後にAcceptedとなり、別ProcessのWorkerがClaimしてAttemptを開始します。Completed、Rejected、Failed、Dead LetterはTerminalであり、新しいLifecycle EventやHandler実行へ進みません。
Rejected
OperationRejectedExceptionは予期された業務拒否です。FrameworkはRejected ResultとTerminal Lifecycleへ変換します。Validation、Authorization、Not Found、Conflict、Business Ruleを安定したCategory/Codeで表現します。
RetryとFailure
Retryable ExceptionはSupervision Policyに従いattempt.failedとattempt.retry_scheduledを記録します。次のWorker Attemptが同じOperationを再Claimします。Retry上限を超えた処理はFailed/Dead Letterへ進みます。
通常のException、Worker Interrupt、Claim Lossは業務拒否として扱いません。Lease、Heartbeat、Fencing Tokenにより、古いWorkerが成功を確定しないようにします。
Outcome
DeferredのCompletedだけがTyped Outcomeを保存します。Inline completedはHTTP ResponseだけへOutcomeを返し、Outcome Recordを作成しません。Rejected、Failed、Retry Scheduled、Dead Letter、Claim LostはOutcome Recordを作成しません。詳細はOutcomeを参照してください。
JournalとOutcomeは別々の保持期間を設定できます。Operation単位のHoldと安全なPurgeについてはRetentionを参照してください。
Lifecycle EventのObserved JSONL、Canonical/Observedの境界、Observer ReplayはJournalで確認できます。
仕組みを理解したらInstallからApplicationを作成します。