Java Apache HttpClient负载平衡池连接

Java Apache HttpClient负载平衡池连接,java,apache-httpclient-4.x,Java,Apache Httpclient 4.x,我们正在使用持久性连接,并尝试在x个时间段后强制断开连接。虽然我看到我们在理论上可以使用连接保持投资策略,但从我所能说的形式来看,这只适用于回应之后。连接处于空闲状态时 我们面临的问题 假设一个客户端,通过负载平衡器访问两个服务器(A、B)。 当其中一台服务器脱机(B)时,所有新连接都会在服务器(A)上建立。 现在,当另一台服务器(B)重新联机时,它将保持空闲状态,因为所有连接都在另一台服务器(A)上。只要客户端继续访问低于空闲超时/keepalive的连接,这将继续,使B服务器空闲(也称为零连

我们正在使用持久性连接,并尝试在x个时间段后强制断开连接。虽然我看到我们在理论上可以使用连接保持投资策略,但从我所能说的形式来看,这只适用于回应之后。连接处于空闲状态时

我们面临的问题

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

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

我们尝试扩展HttpClientConnectionManager,跟踪一个连接打开了多长时间,然后在x时间后关闭它……但是这似乎不起作用。我猜这是因为
HttpClientConnection
实际上不是实际的连接,而是一个代理,看起来在这个代理之下,它实际上是在“使用”一个已建立的连接,因此不可能实际跟踪这些基础连接已建立的时间

想法

现在我只是想打个电话:
HttpRequestBase.abort()
一旦我们对一个连接执行了请求,它每分钟会对一个连接执行一次操作,我想这会让我们更接近期望的行为。

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

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

这将迫使所有连接在一分钟后更新。

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

              +--> SA
C <---> LB <--+
              +--> SB
+-->SA
C磅某人

客户端可以具有到负载平衡器的持久连接。
LBSA
LBSB
连接可以使用持久连接,也可以不使用,这无关紧要。负载平衡器应该理解该层上的HTTP和路由,而不仅仅是TCP连接。因此,同一个持久连接上的两个传入(到LB)HTTP请求可以路由到两个单独的服务器。

您是否控制负载平衡器?也许有一种解决方案是关闭粘性会话。没有粘性会话,它是robbin。但一旦创建了持久连接,它就会保持。因此需要定期关闭持久连接,以便lb可以再次跨服务器进行负载平衡。在这种情况下,您有什么突破吗?我也有同样的场景,希望找到解决方法的可靠方法。我们定期(2分钟)向服务器发送一个假请求到“/”,并在其响应时中止该连接,这确保至少每2分钟一个持久连接将重新连接到lb,强制连接随时间重新平衡。(甚至认为我们应该重新配置lb以使用最小的负载,以确保它做正确的事情)。事实上,我认为lb可以每隔一段时间循环lb->(SA,SB)一次,确保如果SB消失,它可以在下面,在它回来后重新建立连接SB连接..(通过关闭SA连接)..同时,客户端会忘记这一点。这是可行的..但它的缺点是,当客户端同时建立X个连接时..可能会导致所有这些连接同时断开并重新建立,这并不理想。让TTL在一个时间窗口内随机化将是理想的。这就是我正在尝试做的。不,它不会。HttpClient不会主动退出过期的连接。当从池中租用连接时,它会被动地丢弃过期的连接。嗯,在这一点上,我倾向于每分钟中止一个连接,或者类似的。