ホームページ  >  記事  >  バックエンド開発  >  なぜ net/http は 30 秒を超えるタイムアウト期間を考慮しないのですか?

なぜ net/http は 30 秒を超えるタイムアウト期間を考慮しないのですか?

WBOY
WBOY転載
2024-02-11 17:30:08827ブラウズ

为什么 net/http 不考虑超过 30 秒的超时持续时间?

#php エディター Banana は、ネットワーク リクエストのタイムアウト期間について議論しているときに発見しました。なぜ net/http は設計時に 30 秒を超えるタイムアウト制限を考慮しなかったのですか?タイムアウト期間とは、リクエストの送信後、指定された時間内に応答が受信されない場合、リクエストは失敗したとみなされることを意味します。ネットワークリクエストではタイムアウトの設定が非常に重要で、短すぎるとリクエストが失敗する可能性があり、長すぎるとリソースが無駄に消費されます。分析によると、主な理由は、設計時にパフォーマンスとリソースのバランス、およびネットワーク環境の不確実性が考慮されていたためです。次に、この質問に詳しく答えていきます。

質問内容

golang 1.20.1を使用してください。

golang の net/http および context パッケージでは、30 秒を超えるタイムアウトを設定できません。

のように、タイムアウトを短く設定するとうまく機能します。

コード:

リーリー ###ログ:### リーリー

タイムアウトは 60 秒ではなく 30 秒です。

http.newrequestwithcontext(...)

を使用し、同じタイムアウトが設定されたコンテキストを使用すると、同じ動作が得られます。 コード:

リーリー ###ログ:### リーリー

ただし、どちらの方法でもタイムアウトを 3 秒 (

time.duration(time.sec * 3))

に変更すると、期待どおりに機能します。

log.infof("elasticsearch url is %v", elasticsearchurl)
    client := &http.client{timeout: time.duration(time.second * 60)}
    req, err := http.newrequest("get", listbackupsurl, nil)
    if err != nil {
        internalerror(w, fmt.sprintf("error creating request: %v", err))
        return
    }
    req.setbasicauth(username, password)
    resp, err := client.do(req)
    if err != nil {
        // handle error
        internalerror(w, fmt.sprintf("error accessing elasticsearch: %v", err))
        return
    }

解決策問題の原因を絞り込むために、問題を切り分けて可能性を排除します。可能であれば、必要な部分だけを処理できるように、コードの小さなスニペットを使用してください。

インフラストラクチャをテストするには、

httpstat

を使用すると、リモート タイムアウトをシミュレートできます。例: ### リーリー

現時点で

dial tcp ip:port: i/o timeout

タイムアウトを受信した場合は、オペレーティング システムとファイアウォールを確認する必要があります。 Go で設定したタイムアウトは OS のデフォルトを上書きする必要がありますが、この方法でタイムアウトが発生する場合は、ファイアウォール (ローカルまたはリモート) が原因である可能性があります。 また、外部から接続できる場合は es がタイムアウトする可能性がありますが、ドキュメントによれば es から直接エラー メッセージが表示されることが予想されます。 es

のタイムアウトを URL に直接設定してテストできます。 ### お役に立てれば。

以上がなぜ net/http は 30 秒を超えるタイムアウト期間を考慮しないのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。