非同期チャンク処理では進捗通知の失敗と成功結果の蓄積を分離する
バックエンド
テスト
非同期処理
判断
運用
非同期チャンク処理で、各チャンクの成功結果を累積しながら進捗通知や heartbeat などの callback を呼ぶ場合、結果の蓄積と通知の成否を同じ promise chain の成否に載せると危険になる。通知 callback が一度失敗して chain が rejected になると、後続の成功チャンクを chain に追加しても fulfilled handler が実行されず、処理本体は成功しているのに累積結果へ merge されない、という不整合が起きる。
判断基準
- DB 更新や外部状態変更など、処理本体が成功した事実を表す結果蓄積は、進捗通知・heartbeat・UI 更新などの副作用 callback より先に、かつ callback の成否に依存しない経路で行う。
- callback の失敗は最初のエラーとして記録し、最終的には呼び出し元へ返す。ただし、そのエラーで成功済みチャンクの結果蓄積 chain を reject させたままにしない。
- 一度エラーが出た後は、追加の進捗通知を止めてもよい。重要なのは通知を続けることではなく、成功済みチャンクの結果を失わず、後続の補正・集計・リカバリに渡せること。
- 失敗時に部分結果から補正処理を行う設計では、補正対象の取得 API は「通知前に merge 済みの成功結果」を返す必要がある。
検証
並列度 2 以上で、先行チャンクの進捗 callback を失敗させ、その時点で別のチャンクも処理中にしておく。後続チャンクの処理本体を成功させた後、最終エラーは先行 callback のエラーとして返りつつ、累積結果には両方の成功チャンクが含まれることをテストする。単一チャンクだけの callback 失敗テストでは、後続成功チャンクの merge 漏れを検出できない。