Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Http客户端和负载平衡器_Java_Httpclient_Load Balancing_Apache Httpclient 4.x - Fatal编程技术网

Java Apache 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个)。默认情况下,此连接是持久连接,因为我使用的

在花了几个小时阅读Http客户机文档和源代码之后,我决定在这里寻求帮助

我有一个负载平衡器服务器,使用类似这样的循环算法


+--->RESTServer1
客户端-->负载平衡器+-->RESTServer2
+--->RESTServer3

我们的客户机使用HttpClient将请求定向到负载平衡器服务器,负载平衡器服务器反过来将请求转发到相应的RESTServer

现在,ApacheHttpClient在默认情况下创建(默认情况下每个路由2个)。默认情况下,此连接是持久连接,因为我使用的是Http v1.1,并且我的服务器正在发送Connection:Keep-Alive头

因此,问题在于,由于HttpClient创建了这种持久性连接,因此这些连接不再受均衡器级别的轮抢算法的约束。它们每次都会攻击同一台服务器

这造成了两个问题:

  • 我可以看到,有时一个或多个平衡服务器的流量过载,而一个或多个其他服务器处于空闲状态;及
  • 即使我从平衡器中取出一台REST服务器,它仍然会在持久连接处于活动状态时接收请求
  • 这绝对不是我们想要的行为

    我想我可以在我的响应中强制执行
    连接:close
    头,或者我可以在没有连接池的情况下运行HttpClient,或者在没有连接池的情况下运行HttpClient。但是对于HttpClient来说,使用池背后的想法是通过避免每次打开套接字以及执行所有TPC握手和相关操作来提高性能。因此,我必须得出结论,使用连接池有利于提高应用程序的性能

    所以我这里的问题是,有没有一种方法可以在负载平衡器中使用持久连接,或者在这种情况下我是被迫使用非持久连接的


    我想要重用连接所带来的性能,但我希望它们能够正确地进行负载平衡。如果可能的话,有没有关于如何使用Apache Http客户端配置此场景的想法?

    您的问题可能更多地与您的负载平衡器配置和负载平衡风格有关。有几种方法:

  • HTTP重定向
  • LB充当反向代理
  • 纯分组转发
  • 在场景1和场景3中,您没有机会使用持久连接。如果负载平衡器的作用类似于反向代理,那么可能有一种方法可以通过平衡实现持久连接。“哑”平衡器(如SMTP或LDAP)根据TCP连接选择目标,而不是基于请求

    例如,带有平衡器模块(请参阅)的Apache HTTPd服务器可以将每个请求(即使在持久连接上)分派到不同的服务器

    还要检查您是否没有收到可能是会话持久性的平衡器cookie,以便原因不是持久性连接,而是平衡器cookie

    HTH,标记+1至@mp911de答案


    通过将持久连接的总生存时间限制在短时间内,例如15秒,还可以使场景1和场景3工作得相当好。通过这种方式,连接的寿命足够长,可以在活动期间重复使用,而在相对不活动期间,连接的寿命足够短,可以消失。

    我相信您可以在平衡器中配置它。这是一个正确的地方,让你的手脏了,以获得所需的行为。这是一个相当好的线索。我们使用的是F5 LB,我刚刚发现它似乎描述了您在回答中提到的内容。您的意思是“数据包转发”?是的,我已经修复了它。谢谢你的提示。