GaiaExGaiaEx
RESTful API設計とWebSocket統合
開発者プログラミング10 min read

RESTful API設計とWebSocket統合

市場データとトレーディングAPIの構築と活用

投稿を共有

REST:リソースと動詞

RESTはCRUDをHTTPにマッピングします。読み取りにはGET、作成にはPOST、部分更新にはPATCH、削除にはDELETEです。ステータスコードは正直に使いましょう――エラーのJSONを200で返すとクライアントが壊れます。

パスにバージョンを含め(/v1/)、大きなリストはページネーションし(追記専用のストリームにはカーソル形式のフィードを使う)、破壊的変更は非推奨期間を設けて文書化しましょう。

REST vs WEBSOCKET Commands vs streaming—most exchanges use both REST (HTTPS) Request → response → idle Place/cancel, balances, snapshots WebSocket Persistent duplex channel Trades, book deltas, tickers
状態変更にはREST、継続的な市場データにはWebSocketを使いましょう――HTTPのレート制限速度でオーダーブックをポーリングしないでください。

キーとHMAC

APIキーは身元を示し、シークレットは証明します。取引エンドポイントでは、シークレットが通信経路に乗らないよう、正規化された文字列(メソッド+パス+ボディ+タイムスタンプ)をHMACで署名しましょう。リプレイをブロックするため、古すぎるタイムスタンプは拒否します――±30秒が一般的なウィンドウです。

OAuthはサードパーティアプリに向いています。純粋な取引所ボットは多くの場合、キー+HMACのまま運用されます。レート制限:429を想定し、Retry-Afterヘッダーを尊重しましょう。

WebSocketアップグレード

セッションはUpgrade: websocket付きのHTTP GETとして始まり、サーバーは101 Switching Protocolsを返します。その後、フレームはHTTPポーリングでのTLSハンドシェイクの繰り返しに比べて安価です。

サブスクライブメッセージは通常JSONです。メソッド、チャンネル、そしてプライベートな約定情報のための認証署名を含むこともあります。

オーダーブック、取引、リカバリー

取引のストリームはティックデータであり、オーダーブックはシーケンス番号付きのスナップショット+デルタです。シーケンスを見逃した場合は、RESTのスナップショットから再同期し、シーケンス番号がスナップショットより大きいデルタを適用してください。

ハートビート:pingを送るか、サーバーからのpingを受け取ることを想定してください。サンダーヒングハード(一斉再接続)を避けるため、ジッターを加えたバックオフで再接続しましょう。

ORDER BOOK RESYNC Sequence gaps mean your local book is wrong until fixed WS drop REST snapshot Subscribe deltas apply only if seq > snapshot_seq seq: 10421 gap 10422–10429 snapshot @10429 delta 10430+ Trading on a stale book is worse than pausing quotes for one second
切断後:まずスナップショット、次にデルタです――欠けているレベルを推測しないでください。

GraphQLとOpenAPI

GraphQLはダッシュボードにおける過剰なフェッチを削ります。多くの取引所は、取引のホットパスにはそれでもRESTを公開しています。OpenAPI(Swagger)の仕様はコード生成とQAを助けます――例は必ずコピー&ペースト可能な状態にしておきましょう。

最小限のコンシューマーパターン

WebSocketのループをタスクとして動かし、最新価格をスレッドセーフなマップに格納し、ヘルスチェック用にHTTPを公開しましょう。再接続の回数をログに記録し、それが急増したらアラートを出しましょう。

署名とクロックスキュー(時刻のずれ)のテストをCIに組み込みましょう。本番環境で壊れたHMACは、ログを調査するまで「市場が動いた」のと区別できません。