热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ApacheHttp客户端和负载平衡器

如何解决《ApacheHttp客户端和负载平衡器》经验,为你挑选了1个好方法。

花了几个小时阅读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,马克


推荐阅读
author-avatar
冰_若真人_755_171
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有