DNS 解決最適化スキルと Go 言語での http.Transport の実践

PHPz
リリース: 2023-07-21 23:42:33
オリジナル
1649 人が閲覧しました

DNS 解決最適化スキルと Go 言語での http.Transport の実践

要約:
ネットワーク プログラミングに Go 言語を使用する場合、多くの場合、HTTP リクエストを処理するために http.Transport を使用する必要があります。 http.Transport では、DNS 解決は非常に重要なリンクであり、要求の応答時間と全体的なパフォーマンスに大きな影響を与えます。この記事では、Go 言語で http.Transport の DNS 解決を最適化するためのいくつかのヒントと実践方法を紹介し、コード例を通じてそれを示します。

  1. DNS キャッシュを設定する
    デフォルトでは、Go 言語 http.Transport は DNS 解決結果をキャッシュせず、DNS 解決はリクエストごとに実行されます。これにより、特に多数のリクエストが行われた場合、リクエストの応答時間が長くなる可能性があります。 http.Transport の DialContext を設定することで、DNS 解決のキャッシュを有効にできます。例は次のとおりです。
import (
    "net"
    "net/http"
    "time"
)

func main() {
    transport := &http.Transport{
        DisableKeepAlives: true,
        DialContext: (&net.Dialer{
            Timeout: time.Second * 30,
            KeepAlive: time.Second * 30,
            Resolver: &net.Resolver{
                PreferGo: true,
                Dial: (&net.Dialer{
                    Timeout:   time.Second * 5,
                    KeepAlive: time.Second * 5,
                }).Dial,
            },
        }).DialContext,
    }

    client := &http.Client{
        Timeout:   time.Second * 60,
        Transport: transport,
    }
    
    // 使用client发起HTTP请求
    // ...
}
ログイン後にコピー

上記の例では、DialContext の Resolver を net.Resolver に設定し、PreferGo を true に設定することで、Go 言語の DNS 解決を有効にします。さらに、グローバル タイムアウトと接続キープアライブ時間だけでなく、適切なタイムアウトも設定します。

  1. カスタム DNS パーサーを使用する
    Go 言語のデフォルトの DNS パーサーは、多数のホスト名を解決する場合など、特定のシナリオには適していない可能性があります。この場合、カスタム DNS リゾルバーを使用してパフォーマンスを向上させることができます。以下は、github.com/miekg/dns ライブラリを使用した簡単な例です。
import (
    "context"
    "net"
    "net/http"
    "time"

    "github.com/miekg/dns"
)

type CustomDialer struct {
    resolver *dns.Resolver
}

func (d *CustomDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
    host, port, _ := net.SplitHostPort(address)
    msg := new(dns.Msg)
    msg.SetQuestion(dns.Fqdn(host), dns.TypeA)
    in, err := d.resolver.ExchangeContext(ctx, msg, net.JoinHostPort(d.resolver.Preferred()...))
    if err != nil {
        return nil, err
    }
    if len(in.Answer) == 0 {
        return nil, fmt.Errorf("no answer found for %s", host)
    }
    a := in.Answer[0].(*dns.A)
    return (&net.Dialer{
        Timeout:   time.Second * 5,
        KeepAlive: time.Second * 5,
    }).DialContext(ctx, network, net.JoinHostPort(a.A.String(), port))
}

func main() {
    resolver := &dns.Resolver{
        PreferGo: true,
    }

    transport := &http.Transport{
        DisableKeepAlives: true,
        DialContext: (&CustomDialer{
            resolver: resolver,
        }).DialContext,
    }

    client := &http.Client{
        Timeout:   time.Second * 60,
        Transport: transport,
    }
    
    // 使用client发起HTTP请求
    // ...
}
ログイン後にコピー

上の例では、カスタム DNS 解決プロセッサを使用して、DialContext メソッドを実装する CustomDialer タイプを定義します。分析。 github.com/miekg/dns ライブラリを使用して DNS リクエストを送信し、返された結果から IP アドレスを取得し、net.Dialer を使用して実際の接続を確立します。

結論:
http.Transport の DNS 解決を最適化することで、Go 言語ネットワーク プログラミングのパフォーマンスと応答時間を大幅に向上させることができます。実際のアプリケーションでは、シナリオに応じて適切な最適化方法を選択して、システムのパフォーマンスと安定性を向上させることができます。

参考リンク:

  • [Go ドキュメント](https://golang.org/pkg/net/http/)
  • [github.com/miekg] /dns](https://github.com/miekg/dns)

(注: 上記のコード例は参考用です。実際に使用するには、特定の状況に応じて適切な変更と調整が必要です。 )

以上がDNS 解決最適化スキルと Go 言語での http.Transport の実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート