我们正在使用持久连接,并尝试在x个时间后强制连接被丢弃。虽然我认为我们理论上可以使用ConnectionKeepAliveStrategy,但我可以说它只能在响应之后应用。连接闲置时。
我们遇到的问题..
假设有1个客户端,通过负载均衡器命中2个服务器(A,B)。 当其中一个服务器脱机(B)时,所有新连接都在服务器(A)上建立。 现在,当其他服务器(B)重新联机时,它将保持空闲状态,因为所有连接都在另一台服务器上(A)。只要客户端持续访问低于空闲超时/保持连接的连接,这将继续,使B服务器空闲(也称为零连接)。
我们想做什么..强制所有持久连接定期关闭(在'随机时间窗口内'。理想情况下,我们不希望所有连接同时重置)。有关这样做的任何建议吗?
我们尝试扩展HttpClientConnectionManager
,并跟踪连接打开的时间,然后在x金额时间之后将其关闭...但是这似乎不起作用。我猜这是因为HttpClientConnection
实际上并不是实际的连接,而是一个代理,看起来就像在这个代理下面,它实际上是“使用”已建立的连接之一,因此无法实现实际上跟踪建立基础连接的时间。
思想?
现在我想要简单地打电话:
一旦我们对其执行了请求,我就会在每分钟1个连接上HttpRequestBase.abort()
,我认为这会让我们更接近所期望的行为。
答案 0 :(得分:3)
可以使用TTL(生存时间)参数限制连接的总生命期。
HttpClientBuilder.create()
.setConnectionTimeToLive(1, TimeUnit.MINUTES)
.build();
这将迫使所有连接在一分钟后续订。
答案 1 :(得分:3)
我认为您没有正确使用负载均衡器。如果你这样连线:
+--> SA
C <---> LB <--+
+--> SB
客户端可以与负载均衡器建立持久连接。 LB<-->SA
和LB<-->SB
连接可以是持久连接,也可以不是,并不重要。负载均衡器应该了解该层上的HTTP和路由,而不仅仅是TCP连接。因此,同一持久连接上的两个传入(到LB)HTTP请求可以路由到两个单独的服务器。