Featured image of post バックエンドのURLが3か月で6回変わり、フロントを毎回直す。窓口を1つにする【API Gateway】

バックエンドのURLが3か月で6回変わり、フロントを毎回直す。窓口を1つにする【API Gateway】

コード探偵ロックの事件簿:フロントエンドが4つのマイクロサービスを直接呼んでいたため、Order サービスのベースパスが3か月で6回変わり、そのたびにエンドポイント一覧とコードを直した。窓口を1つ置き、ルーティング表で変更を吸収する(API Gateway)。

Featured image of post 一斉切り替えの演習で、未実装のキャンセルまで新系へ送られた。機能ごとに移す【Strangler Fig】

一斉切り替えの演習で、未実装のキャンセルまで新系へ送られた。機能ごとに移す【Strangler Fig】

コード探偵ロックの事件簿:基幹システムの刷新を1つのフラグで一斉に切り替える計画だったが、演習で注文は通ったのに未実装のキャンセルまで新系へ送られ、窓口を通らない旧系直結の処理も残っていた。機能ごとに少しずつ移し、移行の判断と翻訳を分ける(Strangler Fig)。

Featured image of post キューの処理を4台に増やしたら、同じ出荷が二重に予約された。重複を1回に抑える【Competing Consumers】

キューの処理を4台に増やしたら、同じ出荷が二重に予約された。重複を1回に抑える【Competing Consumers】

コード探偵ロックの事件簿:出荷指示キューが1台では締切に間に合わず4台に増やしたら、同じ出荷の予約が37件重複した。複数のワーカーで同じキューを取り合いつつ、冪等キーで副作用を1回に抑え、成功してから ack する(Competing Consumers)。

Featured image of post 処理できないメッセージが戻り続け、メールの送信キューが7時間止まった。隔離する【Dead Letter Queue】

処理できないメッセージが戻り続け、メールの送信キューが7時間止まった。隔離する【Dead Letter Queue】

コード探偵ロックの事件簿:失敗したメッセージをキューに戻し続けていたため、注文確認メールの送信キューが7時間止まり、826件が詰まった。試行回数を数え、上限を超えたら別のキューに移して通知し、直した後で再投入する(Dead Letter Queue)。

Featured image of post 起動時に全件を先読みし、起動に42秒、メモリは1.3GB超。必要になってから読む【Lazy Loading】

起動時に全件を先読みし、起動に42秒、メモリは1.3GB超。必要になってから読む【Lazy Loading】

コード探偵ロックの事件簿:デプロイのたびにワーカーが全テナントのデータを先読みし、起動に42秒、メモリは 1.3GB を超えていた。実際に触るのはその一部だけ。重いデータは必要になるまで読まず、一覧の経路だけは明示的に先読みする(Lazy Loading)。

Featured image of post リクエストごとにDB接続を作って捨て、p99が350msに。接続を使い回す【Object Pool】

リクエストごとにDB接続を作って捨て、p99が350msに。接続を使い回す【Object Pool】

コード探偵ロックの事件簿:注文 API が1リクエストごとに DB 接続を作って捨てていたため、ピーク時の p99 が 350ms に跳ねた。接続をプールで使い回し、返すときに状態をリセットし、例外でも必ず返却する(Object Pool)。

Featured image of post 月末のバッチがDB接続を使い切り、サイト全体が30分止まった。区画を分けて守る【Bulkhead】

月末のバッチがDB接続を使い切り、サイト全体が30分止まった。区画を分けて守る【Bulkhead】

コード探偵ロックの事件簿:注文 API・商品検索 API・レポートバッチが1つの DB コネクションプールを共有していたため、月末のバッチの暴走でサイト全体が30分止まった。機能ごとに使える接続を分け、上限に達したら待たずに断る(Bulkhead)。

Featured image of post フォールバックが同じDBを叩き、30秒のはずの停止が30分に。別の経路を用意する【Fallback Pattern】

フォールバックが同じDBを叩き、30秒のはずの停止が30分に。別の経路を用意する【Fallback Pattern】

コード探偵ロックの事件簿:在庫照会 API が遅れたときの代わりの経路が、遅延の原因と同じ DB を直接読んでいたため、30秒で済むはずの停止が30分の全面停止になった。キャッシュ・既定値・機能の縮退の順に、主経路と独立した代わりを並べる(Fallback Pattern)。

Featured image of post CBもリトライも正常なのに、在庫APIの遅延で注文が30分止まった。上限を決める【Timeout】

CBもリトライも正常なのに、在庫APIの遅延で注文が30分止まった。上限を決める【Timeout】

コード探偵ロックの事件簿:在庫照会 API が55秒かかる状態が30分続き、その間注文処理が止まった。タイムアウトは設定しておらず、HTTP::Tiny の既定の60秒のままだった。接続と読み取りの上限を分け、呼び出し先ごとに値を決める(Timeout)。