我有一个连接到云服务器设置的客户端 - 一个 HAProxy 实例(几个之一,由负载平衡器确定),然后它将请求转发到正确的后端服务器。
从客户端的角度来看,这只是一个常量 URI,但是当负载均衡器切换处理请求的 HAProxy 实例时会出现问题。发生这种情况后,HttpClient 发送的每个后续请求都来自不同的本地端口,并被后端服务器视为新连接。
持久连接对应用程序至关重要,因此这会严重破坏它。奇怪的是,一旦客户端应用程序重新启动,问题就会自行解决。这让我相信问题出在客户端,而不是云设置或后端服务器。
我在这里缺少什么吗?我认为在连接通过一个 HAProxy 实例时创建 ServicePoint 的 ServicePointManager 可能存在问题,并且由于该对象在应用程序的生命周期内维护,因此通过第二个 HAProxy 实例使用它可能存在一些问题。重新启动应用程序时,ServicePoint 实例将丢失并重新创建。
更新:我注意到 ServicePoint 对象最初具有 HTTP 协议 1.1,但一旦出现问题,它已更改为 1.0。HTTP 1.1 默认有持久连接,而 HTTP 1.0 默认有临时连接。
如果我在一切正常时将 ServicePoint 对象协议更改为 1.0,我将收到 502 Bad Gateway 异常(尽管它似乎已恢复并更改回 1.1 以进行下一个请求)。
我猜云堆栈中的某些东西导致协议在负载平衡后更改为 1.0。