【发布时间】:2016-09-21 09:29:06
【问题描述】:
我们正在使用持久连接,并尝试在 x 时间后强制断开连接。虽然我看到我们理论上可以使用 ConnectionKeepAliveStrategy,但我可以说这仅适用于响应之后......即连接空闲时。
我们遇到的问题..
假设有 1 个客户端,通过负载均衡器访问 2 个服务器(A、B)。 当其中一台服务器脱机 (B) 时,所有新连接都会在服务器 (A) 上建立。 现在,当另一台服务器 (B) 重新联机时,它将保持空闲状态,因为所有连接都在另一台服务器 (A) 上。只要客户端继续访问低于空闲超时/保持活动的连接,这将继续,使 B 服务器空闲(也就是零连接)。
我们想要做的是强制所有持久连接定期关闭(在“随机时间窗口”内。理想情况下,我们不希望所有连接同时重置)。对此有何建议?
我们尝试扩展HttpClientConnectionManager,并跟踪连接打开了多长时间,然后在 x 一段时间后将其关闭……但这似乎不起作用。我猜这是因为HttpClientConnection 实际上不是实际的连接,而是一个代理,看起来像在这个代理下面,它实际上是“使用”一个已建立的连接,因此无法实际跟踪建立这些基础连接的时间。
想法?
现在我正在玩弄简单调用的想法:
HttpRequestBase.abort() 在我们对其执行请求后每分钟 1 个连接,我认为这会让我们更接近预期的行为。
【问题讨论】:
-
您能控制负载均衡器吗?也许一种解决方案是关闭粘性会话。
-
没有粘性会话,它是循环的..但是一旦创建了持久连接..它就会停留..因此需要定期关闭持久连接,因此 lb 可以再次进行负载平衡跨服务器。
-
这个场景你有什么突破吗?我完全有同样的场景,正在寻找关于如何处理它的可靠想法。
-
好吧,我们最终定期(2 分钟)向服务器发送一个虚假请求到“/”,并在其响应时中止该连接,这确保至少每 2 分钟一个持久连接将重新连接到 lb,迫使连接随着时间的推移重新平衡。 (甚至认为我们应该重新配置 lb 以使用最小负载来确保它做正确的事情)。
标签: java apache-httpclient-4.x