我正在使用go编写代理。 我正在使用标准库中的ReverseProxy和默认的Transport。假设我们的代理只有一个源主机。 我们将
假设那个主机的DNS记录更改并指向新的IP地址。我们仍将保持与原始IP的连接,因为这永远不会关闭,所以我们永远不需要建立新的连接,因此不会开始与新的IP通信(在假定原始主机在dns更改后仍处于活动状态的情况下)。
如果我们想设计一个系统,使其对DNS更改响应灵敏,什么模式是合适的?我想到的一个想法是设置一个无限循环,每N秒钟关闭任何空闲连接。这对上面的玩具示例有效,但在流量更大的情况下,有很大的可能性在刷新期间存在正在进行中的请求。
相比之下,另一种方法是仅设置连接可以存活的最长时间。但是,我无法找到一种操纵标准库以实现此目的的方法。
有人能指导一种对DNS更改响应灵敏的设计吗?
DisableKeepAlives
设置为false,允许与源服务器建立多个空闲连接,并将IdleConnTimeout
设置为60秒。 假设客户端每10秒钟使用代理向原始主机发出一次请求。 第一个连接将导致DNS查找以查找原始主机的IP。 传输将保持与该IP的连接永远不会关闭,因为我们在超时之前不断重用它。 Go缓存连接的方式是基于主机而不是IP。假设那个主机的DNS记录更改并指向新的IP地址。我们仍将保持与原始IP的连接,因为这永远不会关闭,所以我们永远不需要建立新的连接,因此不会开始与新的IP通信(在假定原始主机在dns更改后仍处于活动状态的情况下)。
如果我们想设计一个系统,使其对DNS更改响应灵敏,什么模式是合适的?我想到的一个想法是设置一个无限循环,每N秒钟关闭任何空闲连接。这对上面的玩具示例有效,但在流量更大的情况下,有很大的可能性在刷新期间存在正在进行中的请求。
相比之下,另一种方法是仅设置连接可以存活的最长时间。但是,我无法找到一种操纵标准库以实现此目的的方法。
有人能指导一种对DNS更改响应灵敏的设计吗?
IdleConnTimeout
即可自动完成此操作。 - JimBIdleConnTimeout
。当连接实际上从未闲置那么长时间时,问题就会出现。尽管如此,我仍希望连接最终被关闭,以便在创建新连接时使用更新的 DNS。 - Austin PlattIdleConnTimeout
,替换传输的蛮力方法可能是最容易协调的。 - JimB