Apache HttpClient负载平衡池连接

时间:2015-10-31 15:08:34

标签: java apache-httpclient-4.x

我们正在使用持久连接,并尝试在x个时间后强制连接被丢弃。虽然我认为我们理论上可以使用ConnectionKeepAliveStrategy,但我可以说它只能在响应之后应用。连接闲置时。

我们遇到的问题..

假设有1个客户端,通过负载均衡器命中2个服务器(A,B)。 当其中一个服务器脱机(B)时,所有新连接都在服务器(A)上建立。 现在,当其他服务器(B)重新联机时,它将保持空闲状态,因为所有连接都在另一台服务器上(A)。只要客户端持续访问低于空闲超时/保持连接的连接,这将继续,使B服务器空闲(也称为零连接)。

我们想做什么..强制所有持久连接定期关闭(在'随机时间窗口内'。理想情况下,我们不希望所有连接同时重置)。有关这样做的任何建议吗?

我们尝试扩展HttpClientConnectionManager,并跟踪连接打开的时间,然后在x金额时间之后将其关闭...但是这似乎不起作用。我猜这是因为HttpClientConnection实际上并不是实际的连接,而是一个代理,看起来就像在这个代理下面,它实际上是“使用”已建立的连接之一,因此无法实现实际上跟踪建立基础连接的时间。

思想?

现在我想要简单地打电话: 一旦我们对其执行了请求,我就会在每分钟1个连接上HttpRequestBase.abort(),我认为这会让我们更接近所期望的行为。

2 个答案:

答案 0 :(得分:3)

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

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

这将迫使所有连接在一分钟后续订。

答案 1 :(得分:3)

我认为您没有正确使用负载均衡器。如果你这样连线:

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

客户端可以与负载均衡器建立持久连接。 LB<-->SALB<-->SB连接可以是持久连接,也可以不是,并不重要。负载均衡器应该了解该层上的HTTP和路由,而不仅仅是TCP连接。因此,同一持久连接上的两个传入(到LB)HTTP请求可以路由到两个单独的服务器。

相关问题