作者:冰_若真人_755_171 | 来源:互联网 | 2023-05-17 06:02
花了几个小时阅读Http Client文档和源代码后,我决定绝对应该在这里寻求帮助。
我有一个使用轮询算法的负载均衡器服务器,如下所示
+---> RESTServer1
client --> load balancer +---> RESTServer2
+---> RESTServer3
我们的客户使用HttpClient将请求定向到我们的负载均衡器服务器,该服务器又将请求循环到相应的RESTServer。
现在,Apache HttpClient默认创建一个连接池(默认情况下每个路由2个)。由于我使用的是Http v1.1,并且我的服务器发出的是Connection:Keep-Alive标头,因此默认情况下,此连接为持久连接。
因此,问题在于,由于HttpClient创建了此持久性连接,因此这些连接不再在平衡器级别受循环算法的约束。他们总是每次都访问同一台服务器。
这产生了两个问题:
我可以看到,有时一台或多台平衡服务器负载过大,而另一台或多台其他服务器却处于空闲状态。和
即使我从平衡器中取出一台REST服务器,它在持久连接处于活动状态时仍会接收请求。
绝对不是预期的行为。
我想我可以Connection: close
在响应中强加标头,或者可以在没有连接池或NoConnectionReuseStrategy的情况下运行HttpClient 。但是HttpClient 的文档指出,使用池背后的想法是通过避免每次都要打开套接字并进行所有TPC握手和相关操作来提高性能。因此,我必须得出结论,使用连接池对我的应用程序的性能有利。
所以我在这里的问题是,有没有一种方法可以通过负载均衡器使用持久连接,或者在这种情况下我是否不得不使用非持久连接?
我想要重用连接所带来的性能,但是我希望它们能够适当地负载均衡。关于如何尽可能使用Apache Http Client配置此方案的任何想法?
1> mp911de..:
您的问题也许与您的负载均衡器配置和负载均衡样式更相关。有几种方法:
HTTP重定向
LB充当反向代理
纯数据包转发
在方案1和3中,您将没有持久连接的机会。如果您的负载平衡器的作用像反向代理,则可能存在一种通过平衡实现持久连接的方法。像SMTP或LDAP之类的“哑”平衡器会根据TCP连接选择目标,而不是基于请求。
例如,带有Balancer模块的Apache HTTPd服务器(请参阅http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html)可以将每个请求(即使是持久连接)也分派到不同的服务器。
另外,请检查您没有收到可能是会话持久性的平衡器COOKIE,以使原因不是持久性连接,而是平衡器COOKIE。
HTH,马克