Retry
ネットワークをまたいだリクエストにおいてリトライは非常に重要
ブラウザとアプリケーションサーバーだけでなく、マイクロサービス間の通信など様々な状況が考えられる
ネットワークは信頼できないものという前提で考える必要がある
例えばクライアントがサーバーに送ったリクエストがタイムアウトした場合、どう処理されたのかクライアントが知ることは不可能
リクエストが成功したが結果がネットワーク上で消失した
リクエストが失敗したが結果がネットワーク上で消失した
リクエストが到達せずネットワーク上で消失した
など
そのためタイムアウトした場合やサーバーが一時的に応答できなくなっている状態などではリトライした方が良いことが多い
リクエスト
リクエストは冪等性を担保する
リトライ
適切なBackoffを行い、サーバーに高負荷がかかることを避ける
exponential にインターバルを設定したとしても時間が被ってしまっては問題なためジッターをいれる
多くのサーバーから同時にリクエスト/リトライされないようジッターを入れる
そもそもリトライが必要ないリクエストはリトライしない
リトライしない選択肢も考える
結果整合性を保つ
処理が非同期で良いものはキューを使ってリクエストをバッファリングする
サーバーすべてが死ぬまでに問題を早急に復旧させることが重要。高負荷状態では一部をメンテナンス状態にするなども考える
マイクロサービスであればそもそもサービスを分けない
ref