【要約】GMOコインFX APIのレートリミット(POST 1回/秒)をクライアント側で強制する設計 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がGMOコインFXのPrivate APIを用いた自動売買システムを構築する際、レートリミット超過と二重注文のリスクに直面した。APIの仕様と運用上の制約から、以下の課題が生じていた。
- ・POSTリクエスト(発注・取消)は失敗時のコストが高く、安易な再送が二重注文を招く恐れがある。
- ・GMOのAPIはHTTPステータスではなくレスポンスボディでエラーを返すため、標準的なバックオフが使いにくい。
- ・タイムアウト発生時、サーバー側で処理が完了しているか不明なため、即時再送が極めて危険である。
// Approach
開発者は、サーバーの挙動に依存せず、リクエストを送信前に確実に制御する「プロアクティブなRateLimiter」を設計した。以下の手法を用いて、安全性を担保している。
- ・
wait_post(送信前)とmark_post_done(応答受信後)の2フェーズ制を採用し、クールダウンの起点を応答受信後に設定した。 - ・
threading.Conditionを用い、応答待ち中のリクエスト(in-flight)がある間は後続をブロックする直列化を実現した。 - ・
time.monotonic()を使用し、NTP同期による時刻の飛びの影響を排除した。 - ・例外発生時(タイムアウト等)も必ずクールダウンを進めることで、即時再送を防止した。
// Result
サーバーの計測タイミングが不明な状況下で、最も保守的な間隔を維持できる設計を実現した。これにより、以下の成果を得ている。
- ・レートリミット超過によるエラーを未然に防ぎ、二重注文のリスクを最小化した。
- ・分散リミッターを導入せず、実行タイミングの制御と冪等性設計を組み合わせることで、システムの複雑性を抑えつつ要件を満たした。
- ・実時間を使わないモックテストにより、決定的な検証環境を構築した。
Senior Engineer Insight
> 本設計の白眉は、技術的な解決策とアーキテクチャをセットで検討している点だ。分散リミッターという「正解」に飛びつかず、実行タイミングの分散と冪等性で吸収できる例外を切り分ける判断は、運用コストを抑える実戦的な知恵である。金融系のように「失敗のコスト」が極めて高い領域では、スループットを犠牲にしてでも保守側に倒すこの姿勢が不可欠だ。非常に優れた設計思想である。