【问题标题】:Apache HttpClient loadbalancing pooled connectionsApache HttpClient 负载平衡池连接
【发布时间】: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


【解决方案1】:

可以通过使用 TTL(生存时间)参数来限制连接的总生存时间。

HttpClientBuilder.create()
        .setConnectionTimeToLive(1, TimeUnit.MINUTES)
        .build();

这将强制所有连接在一分钟后更新。

【讨论】:

  • 这可行..但它的缺点是当客户端同时建立 X 连接时..它可能会导致所有这些连接立即断开并重新建立,并不理想.在时间窗口内随机化 TTL 是理想的……这就是我想要做的。
  • 不,不会。 HttpClient 不会主动驱逐过期的连接。当从池中租用连接时,它会被动丢弃过期的连接。
  • 嗯,在这一点上,我倾向于每分钟中止 1 个连接或类似的方法。
【解决方案2】:

我认为您没有正确使用负载平衡器。如果你是这样接线的:

              +--> SA
C <---> LB <--+
              +--> SB

客户端可以与负载平衡器建立持久连接。 LB&lt;--&gt;SALB&lt;--&gt;SB 连接可以是持久连接,也可以不是,没关系。负载均衡器应该理解该层的 HTTP 和路由,而不仅仅是 TCP 连接。因此,同一持久连接上的两个传入(到 LB)HTTP 请求可以路由到两个单独的服务器。

【讨论】:

  • 确实,我认为 LB 可以每隔一段时间循环一次 LB->(SA,SB),确保如果 SB 消失,它可以在下面重新建立连接 SB Connections 一旦它回来。 .(通过关闭 SA 连接)..同时客户端会忘记这一点。
猜你喜欢
  • 2011-04-15
  • 2023-03-09
  • 2014-01-03
  • 2012-12-16
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多