退会と外部サービスのリソース作成が競合すると外部だけが残る
並行処理
決済連携
判断
運用
アカウント削除で外部サービス(決済の Customer など)のリソースも消す設計にしたとき、退会処理と外部リソースの新規作成が並行すると、自サービスのデータは消えたのに外部にリソースだけが孤立して残る。削除側が先に外部を消しても、直後に初回決済などが走れば新しい Customer が作られ、こちらにはそれを指すレコードがない。
対処
退会と外部リソース作成を、複数プロセスでも直列化できる DB 境界で相互排他する(対象行のロック等)。アプリケーション内のロックやテストの追加だけでは多プロセス構成で防げない。
あわせて、外部サービスの削除 API の意味を仕様として固める。例として決済事業者の Customer 削除は、有効なサブスクリプションを即時解約し、カード情報を消す一方で、請求履歴は事業者側に残る。「全部消える」と誤ってポリシーに書かない。
一般化
自システムのトランザクションで守れるのは自システムの内側だけで、外部サービスへの作成・削除はトランザクションの外にある。外部に副作用を持つ不可逆処理を入れるときは、「並行したらどちらが残るか」を先に列挙して、直列化する境界を決める。