【要約】GMOコインFX自動売買の非常停止(Kill Switch) — ロックではなく冪等性で二重決済を防ぐ設計 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が自動売買システムの非常停止機能を実装する際、定時バッチとの同時実行による二重決済のリスクに直面した。
- ・Kill Switchは「確実に止める」ことが最優先であり、ロック取得待ちによる遅延が許されない。
- ・エラーメッセージの部分一致判定により、決済失敗を成功と誤認する致命的なバグが発生した。
- ・GMOのAPIはHTTP 200でもエラーを返すため、ステータスコードのみでは成否が判定できない。
// Approach
開発者は、排他ロックに頼らず、システムの冪等性を高めることで競合を吸収する設計を採用した。
- ・各ステップで必ずサーバから注文・建玉一覧を再取得し、サーバの状態を判断の根拠とする。
- ・決済前に未約定注文を必ず取り消す「キャンセル・ファースト」の順序規約を適用する。
- ・エラー判定は、実測した
message_codeの完全一致のみをno-opとして扱う。 - ・決済完了の根拠を、リクエストの成否ではなく、決済後の建玉再取得による消失確認に置く。
// Result
この設計により、非常停止における「成功と誤認する」リスクを最小化した。
- ・ロックを用いないことで、Kill Switchの即時性と確実性を担保した。
- ・未知のエラーをすべて失敗として報告する Fail-closed 設計を確立した。
- ・決済後に建玉を再取得して突合することで、決済の確実な完了を検証可能にした。
Senior Engineer Insight
> 可用性と整合性のトレードオフにおいて、「安全性」を極限まで重視した優れた判断である。分散ロックによる排他制御は、Kill Switchの「即時停止」という要件と衝突する。これを冪等性で解決するアプローチは、分散システムにおける定石といえる。特に、エラー判定における「部分一致の回避」や「実測値のみの許可」といった、現場の失敗から得た教訓が設計に反映されている点は、極めて実践的で信頼に値する。