ホームページ  >  記事  >  バックエンド開発  >  golang http 接続を閉じる

golang http 接続を閉じる

WBOY
WBOYオリジナル
2023-05-13 10:03:361576ブラウズ

Golang を HTTP プログラミングに使用する場合、接続を閉じる方法をよく検討する必要があります。接続を閉じると、リソースの無駄が効果的に回避され、パフォーマンスが向上し、ネットワークの問題によって引き起こされる不要なトラブルが軽減されます。この記事では、Golang で HTTP 接続を閉じる方法と、詳細の一部を分析する方法を詳しく紹介します。

1. HTTP 接続を閉じる方法

Go 言語の HTTP クライアントとサーバーは、HTTP 接続を管理するための一連の基礎的なプロセスを実装します。これらの低レベルの処理は通常、ユーザーには公開されませんが、HTTP クライアントおよびサーバーによる内部実装に隠蔽されます。では、HTTP クライアントとサーバーの接続を閉じるにはどうすればよいでしょうか?

  1. HTTP クライアント

HTTP クライアントでは、接続を閉じる方法がいくつかあります。

  • defer キーワードを使用して手動で閉じます。接続: クライアントがインターフェイスを呼び出した後、通常、接続は自動的に閉じられます。ただし、現在のクライアントがインターフェイスを複数回要求する必要がある場合は、接続の終了を手動で制御し、defer を使用して接続の終了を遅らせることを検討できます。 Transport クラスの MaxIdleConns または MaxIdleConnsPerHost を使用して接続を制御します。 プール内の接続の上限: Go 言語の http.Transport には、HTTP 接続を管理するためのデフォルトの接続プールが含まれています。 2 つのパラメータ MaxIdleConns と MaxIdleConnsPerHost を使用して、アイドル状態の接続の最大数とアイドル状態のホスト接続の最大数を指定できます。このアイドル数に達すると、トランスポートは過剰な接続を自動的に閉じます。コードは次のとおりです。
package main
import (
    "net/http"
    "io/ioutil"
    "fmt"
    "log"
)
func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "http://www.baidu.com", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer client.CloseIdleConnections() // 当函数返回时释放连接
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close() // 当函数返回时关闭body
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(body)[:50])
}
  • HTTP サーバー
    HTTP サーバーでは、通常、接続管理はサーバーによって自動的に管理されます。サーバーを作成し、接続が必要なくなったらサーバーを閉じるだけです。通常、サーバーはリクエストを処理した後、接続を自動的に閉じます。ただし、接続の終了を手動で制御する必要がある特殊な状況がいくつかあります。
HTTP プロセッサーで conn.Close() を使用して接続を閉じます。プロセッサーが HTTP 要求を処理するとき、 if サーバーが接続を閉じる必要がある場合、conn.Close() メソッドを使用して接続を閉じることができます。コードは次のとおりです。

package main
import (
    "net/http"
    "io/ioutil"
    "fmt"
    "log"
)
func main() {
    transport := &http.Transport{
        MaxIdleConns:          10, // 最大空闲连接数
        MaxIdleConnsPerHost:   3,  // 每个域名地址最大空闲连接数
    }
    client := &http.Client{Transport: transport}
    req, err := http.NewRequest("GET", "http://www.baidu.com", nil)
    if err != nil {
        log.Fatal(err)
    }
    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(body)[:50])
}
  • キープアライブの使用: キープアライブを使用する場合、接続のライフ サイクルはサーバーによって管理されます。サーバーはキープアライブ時間を定義して、アイドル状態になってから接続を閉じる時間を制御できます。この時間は通常、HTTP ヘッダーに設定されます。コードは次のとおりです:
package main
import (
    "fmt"
    "net/http"
)
func handler(w http.ResponseWriter, req *http.Request) {
    // 需要关闭连接时,使用conn.Close()
    conn, _, _ := w.(http.Hijacker).Hijack()
    conn.Close()
}
func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}
    2. HTTP 接続リサイクル メカニズム
  • 接続が使い果たされた場合、リソースの漏洩やパフォーマンスの低下を防ぐために、接続のリソースをリサイクルする必要があります。などの問題があります。 HTTP 接続リソースのリサイクル メカニズムでは、通常、次の問題を考慮する必要があります。

HTTP 長い接続の最大存続期間: 接続が一定期間アイドル状態になった後、サーバーは接続をただちにリサイクルします。 。この時間はサーバーによって決定されるため、サーバー オブジェクトの作成時に接続タイムアウトを設定するだけです。

HTTP 接続の最大数: 一定期間内に接続プールで許可される接続の最大数。接続プールが接続プールのサイズを超えると、接続プールは自動的に閉じられます。
  • HTTP 接続再利用メカニズム: 接続再利用とは、複数のリクエストが同時に接続を共有することを意味します。これにより、長い待機状態の間の不必要なリソースの使用を削減できます。ただし、接続タイムアウトが短い場合、一時的なネットワーク変動を伴うリクエストが失敗する可能性があり、システムの安定性に影響を与える可能性があることに注意してください。
  • 3. HTTP 接続プールの管理
  • 大規模で同時実行性の高いシステムでは、システムのパフォーマンスと安定性を向上させるために、接続プールを使用して HTTP 接続を管理する必要があります。 HTTP リクエストを呼び出すとき、接続プールはアイドル状態のネットワーク接続を提供して、頻繁に接続を作成および破棄するオーバーヘッドを回避できます。通常、接続プールは通常のキューを使用して管理され、最初にキューに入った要素が最初に使用されるようになります。つまり、FIFO キューです。 Go 言語を使用して HTTP 接続プールを実装するコードは次のとおりです:
package main
import (
    "log"
    "net/http"
)
func handler(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Connection", "keep-alive") // 定义keep-alive时间
    w.Write([]byte("hello world"))
}
func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

4. 概要

HTTP 接続の制御とリサイクルは、パフォーマンスを最適化するための重要なポイントです。 Golang では、手動制御、Transport クラスを使用したパラメータ設定、および接続プーリングを通じて HTTP 接続を管理し、システムのパフォーマンスと安定性を向上させることができます。さらに、コネクションのリサイクル機構やHTTPコネクションプールの管理なども考慮し、システムを維持・最適化する必要があります。

以上がgolang http 接続を閉じるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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