gpt4 book ai didi

Go 传输连接在 DNS 更改时保持事件状态

转载 作者:IT王子 更新时间:2023-10-29 01:38:20 25 4
gpt4 key购买 nike

我目前正在使用 go 编写代理。我正在使用 ReverseProxy来自标准库,也是默认的 Transport来自标准库。

假设对于这个问题,我们只有一个原始主机作为代理。我们将 DisableKeepAlives 设置为 false,允许多个到源服务器的空闲连接,并将 IdleConnTimeout 设置为 60 秒。

假设客户端使用代理每 10 秒向源主机发出一个请求。第一次连接将导致 DNS 查找以查找原始主机的 IP。传输将保持与该 IP 的连接打开,该连接永远不会关闭,因为我们在超时之前继续重新使用它。 go 缓存连接的方式是在主机上而不是在 IP 上。

现在假设该主机的 DNS 记录更改并指向一个新的 IP。我们仍然会打开与原始 IP 的连接,并且因为它永远不会关闭,所以我们永远不需要建立新连接,因此不会开始与新 IP 通信(假设原始主机在dns 更改)。

如果我们想以响应 DNS 变化的方式设计系统,什么模式是合适的?我的一个想法是有一个无限循环 closes any idle connections每 N 秒存在一次。这适用于上面的玩具示例,但在我们有更多流量流过的情况下,请求很可能会在刷新期间进行中。

另一种方法是设置一个连接可以存活的最长时间。但是我看不到一种方法来操纵标准库来实现这一点。

谁能就响应 DNS 更改的设计提出建议?

最佳答案

从问题来看,代理实现似乎被设计为使用 ip 作为端点。

如果您无法避免使用主机名作为您的目标端点,您可以配置您的 httputil.ReverseProxy.Director解析主机名。以查找时间为代价(可以配置为仅在 dns ttl 过期时查找),您将获得实时更新的目标端点,同时仍然利用 http.Transports连接缓存。

示例导演:

func director(req *http.Request) {
addrs, err := net.LookupHost("yourdomain.com")
if err != nil {
handle(err)
}
if len(addrs) < 1 {
handle(fmt.Errorf("No addresses found"))
}

req.URL.Host = addrs[0]
}

关于Go 传输连接在 DNS 更改时保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com