概要 動機 サービス間通信でリトライ処理をする必要があります。なぜなら、一時的な通信先の不具合など、しばらくしてから再実行することで成功する場合があるからです。しかし、Goの標準パッケージからはリトライ機構は提供されていないので、自身で実装するか他のパッケージを利用しなければなりません。 ここでは具体的な実装例ではなく、net/httpパッケージの実装(主に、http.Clientとhttp.Transport)を踏まえた上で、何がリトライ処理で考慮されているべきかを整理しました。 要約 リトライ処理を実装する場合は以下の観点を考慮する必要があります。 リクエストの内容(Request.Body)をリトライ前に巻き戻す Request.Context()の終了を確認する リトライ前にResponse.Bodyを全て読み切ってから閉じる デフォルトのTransportを使ってコネクションプー