Java Apache Http客户端和负载平衡器
在花了几个小时阅读Http客户机文档和源代码之后,我决定在这里寻求帮助 我有一个负载平衡器服务器,使用类似这样的循环算法Java Apache Http客户端和负载平衡器,java,httpclient,load-balancing,apache-httpclient-4.x,Java,Httpclient,Load Balancing,Apache Httpclient 4.x,在花了几个小时阅读Http客户机文档和源代码之后,我决定在这里寻求帮助 我有一个负载平衡器服务器,使用类似这样的循环算法 +--->RESTServer1 客户端-->负载平衡器+-->RESTServer2 +--->RESTServer3 我们的客户机使用HttpClient将请求定向到负载平衡器服务器,负载平衡器服务器反过来将请求转发到相应的RESTServer 现在,ApacheHttpClient在默认情况下创建(默认情况下每个路由2个)。默认情况下,此连接是持久连接,因为我使用的
+--->RESTServer1
客户端-->负载平衡器+-->RESTServer2
+--->RESTServer3
我们的客户机使用HttpClient将请求定向到负载平衡器服务器,负载平衡器服务器反过来将请求转发到相应的RESTServer
现在,ApacheHttpClient在默认情况下创建(默认情况下每个路由2个)。默认情况下,此连接是持久连接,因为我使用的是Http v1.1,并且我的服务器正在发送Connection:Keep-Alive头
因此,问题在于,由于HttpClient创建了这种持久性连接,因此这些连接不再受均衡器级别的轮抢算法的约束。它们每次都会攻击同一台服务器
这造成了两个问题:
连接:close
头,或者我可以在没有连接池的情况下运行HttpClient,或者在没有连接池的情况下运行HttpClient。但是对于HttpClient来说,使用池背后的想法是通过避免每次打开套接字以及执行所有TPC握手和相关操作来提高性能。因此,我必须得出结论,使用连接池有利于提高应用程序的性能
所以我这里的问题是,有没有一种方法可以在负载平衡器中使用持久连接,或者在这种情况下我是被迫使用非持久连接的
我想要重用连接所带来的性能,但我希望它们能够正确地进行负载平衡。如果可能的话,有没有关于如何使用Apache Http客户端配置此场景的想法?您的问题可能更多地与您的负载平衡器配置和负载平衡风格有关。有几种方法:
通过将持久连接的总生存时间限制在短时间内,例如15秒,还可以使场景1和场景3工作得相当好。通过这种方式,连接的寿命足够长,可以在活动期间重复使用,而在相对不活动期间,连接的寿命足够短,可以消失。我相信您可以在平衡器中配置它。这是一个正确的地方,让你的手脏了,以获得所需的行为。这是一个相当好的线索。我们使用的是F5 LB,我刚刚发现它似乎描述了您在回答中提到的内容。您的意思是“数据包转发”?是的,我已经修复了它。谢谢你的提示。