ホームページ  >  記事  >  バックエンド開発  >  golang http タイムアウト設定

golang http タイムアウト設定

PHPz
PHPzオリジナル
2023-05-15 11:16:071951ブラウズ

Go 言語は、同時プログラミングをサポートする効率的なプログラミング言語であるため、ネットワーク プログラミングに優れています。 HTTP プロトコルは、インターネット アプリケーションを構築する上で重要な部分であり、Go 言語の http パッケージには、HTTP リクエストと応答をサポートする多数のインターフェイスも提供されています。 HTTP ネットワーク呼び出しを行う場合、プログラムの安定性とパフォーマンスを確保するためにタイムアウト構成は非常に重要です。

タイムアウト設定は非常に重要なトピックであり、ネットワーク要求を行うとき、または応答を待つときにプログラムが待機する必要がある時間を定義するために使用されます。 HTTP リクエストでは、サーバーが時間内に応答しない場合、クライアントはリクエストを終了し、他のロジックを実行する必要があります。同様に、長い接続の応答において、クライアントが応答を待っており、タイムアウト内に接続を維持できない場合、プログラム全体がハングする可能性があります。

したがって、Go 言語では、タイムアウト設定の制御スキームと技術的解決策の研究が近年非常に活発になっています。この記事ではGo言語を使ったHTTPネットワーク呼び出しのタイムアウト設定について詳しく紹介します。

  1. Go のタイムアウト制限

Go 言語では、time パッケージを通じてタイムアウト制限を実装できます。 time パッケージは、タイムアウト処理とタイミングを実装するために使用できる Timer タイプを提供します。タイマーを使用して、指定した時間が経過した後に終了する期間を作成します。このタイマーが期限切れになったかどうかをポーリングできます。タイマーが期限切れになった場合は、リクエストをキャンセルするか、代替サーバーを選択するなど、何らかのアクションを実行してください。具体的な実装は次のとおりです。

timer := time.NewTimer(timeout)
defer timer.Stop()
select {
    case <-ch:
        return
    case <-timer.C:
        cancel()
        return
}

上記のコードは、選択とタイマーの C チャネルを使用して待機します。チャネル ch が受信機にデータを送信する場合、select は対応する動作を実行します。タイマーが期限切れになると、キャンセル関数を呼び出して、進行中の操作をキャンセルします。

  1. タイムアウト制御にコンテキスト パッケージを使用する

Go 言語では、コンテキスト パッケージは優れたタイムアウト設定ツールです。コンテキスト パッケージは、複数の goroutine への呼び出し全体で値、キャンセル信号、期限を制御する方法を提供します。 context.WithTimeout メソッドは、コンテキストのタイムアウトを設定し、新しいコンテキストを返すことによってタイムアウトを制御します。指定した時間内に操作が完了すると、タイムアウトタイマーがオフになります。指定した時間内に操作が完了しない場合は、タイムアウト タイマーをオフにして、進行中の操作をキャンセルします。これにより、context.WaitGroup は複数の goroutine の実行を処理するのに最適になります。具体的な実装は次のとおりです。

ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()

req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
    log.Fatal(err)
}

res, err := http.DefaultClient.Do(req)
if err != nil {
    log.Fatal(err)
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
    log.Fatal(err)
}

上記のコードでは、タイムアウト制御されたコンテキストが context.WithTimeout メソッドを通じて作成されます。次に、http リクエストを作成し、http.NewRequestWithContext メソッドを通じてコン​​テキストをリクエスト オブジェクトにリンクします。最後に、http.DefaultClient.Do メソッドを使用してネットワーク要求を作成し、要求の完了後に応答コンテンツを読み取ります。タイムアウトが発生すると、コンテキストはキャンセルされ、後続のリクエストはブロックされます。

  1. タイムアウト設定を適用するためのベスト プラクティス

タイムアウト設定を使用する場合は、次の点に注意する必要があります。

3.1 適切なタイムアウトを設定するperiod:

タイムアウトは、HTTP 要求と応答の処理に必要な時間を許容するのに十分な長さである必要がありますが、プログラムがハングしないほど長すぎてはなりません。タイムアウトの設定が長すぎると、アプリケーションが他の操作に応答できなくなる可能性があります。タイムアウトの設定が短すぎて、要求がすぐに破棄されると、不要なエラーが発生します。したがって、タイムアウトは実際の状況に応じて設定する必要があります。

3.2 withContext メソッドを使用してタイムアウトを設定する

ネットワーク リクエストを行うときは、コンテキストを http.NewRequestWithContext メソッドに設定する必要があります。これにより、リクエストとタイムアウト設定。 http.Client.Transport でタイムアウト設定のみを設定すると、リクエスト エラーが発生する可能性があります。

3.3 リクエストの再試行を適切に制御する:

ネットワーク リクエストを行うときは、リクエストの再試行回数を適切に制御することに注意する必要があります。リクエストがタイムアウトした場合、リクエストを直接終了するのではなく、結果をユーザーにプッシュするためにリクエストを再試行できる回数を事前に設定する必要があります。

  1. 概要

この記事では主に、HTTP ネットワーク リクエストの安定性とパフォーマンスを確保するための Go 言語でのタイムアウト設定の使用方法を紹介します。タイム パッケージまたはコンテキスト パッケージを使用して、タイムアウト制限を設定できます。この設定により、ネットワーク操作を実行する際のプログラムのハングや不要なエラーを効果的に防ぐことができます。同時に、タイムアウトを設定する際には実際の状況を考慮し、適切なリトライ回数を維持する必要があります。実際の使用では、プログラムの安定性とパフォーマンスを確保するために、状況に応じて使用する必要があります。

以上がgolang http タイムアウト設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Rustとgolangの違い次の記事:Rustとgolangの違い