gpt4 book ai didi

java - Apache Http 客户端和负载平衡器

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:10 26 4
gpt4 key购买 nike

在花了几个小时阅读了 Http Client 文档和源代码后,我决定一定要在这里寻求帮助。

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


+---> REST服务器1
客户端 --> 负载均衡器 +---> RESTServer2
+---> REST服务器3

我们的客户端使用 HttpClient 将请求定向到我们的负载平衡器服务器,该服务器又将请求轮询到相应的 RESTServer。

现在,Apache HttpClient 默认创建 a pool of connections (默认情况下每条路线 2 个)。默认情况下,此连接是持久连接,因为我使用的是 Http v1.1 并且我的服务器正在发出 Connection: Keep-Alive header 。

因此,问题在于,由于 HttpClient 创建了此持久连接,因此这些连接不再受制于平衡器级别的循环算法。他们总是每次都访问同一个服务器。

这会产生两个问题:

  1. 我可以看到有时一台或多台平衡服务器因流量过载,而一台或多台其他服务器空闲;和
  2. 即使我将我的一个 REST 服务器从平衡器中取出,它仍然会在持久连接处于 Activity 状态时接收请求。

这绝对不是预期的行为。

我想我可以在响应中强制使用 Connection: close header ,或者我可以在没有连接池或带有 NoConnectionReuseStrategy 的情况下运行 HttpClient。 .但是the documentation for HttpClient 声明使用池背后的想法是通过避免每次都必须打开套接字并执行所有 TPC 握手和相关操作来提高性能。因此,我不得不得出结论,连接池的使用对我的应用程序的性能是有益的。

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

我想要重用连接带来的性能,但我希望它们适本地进行负载平衡。如果可能的话,我对如何使用 Apache Http Client 配置这个场景有什么想法吗?

最佳答案

您的问题可能与您的负载均衡器配置和负载均衡方式有关。有几种方式:

  1. HTTP 重定向
  2. LB 作为反向代理
  3. 纯数据包转发

在场景 1 和 3 中,您没有机会使用持久连接。如果您的负载平衡器充当反向代理,则可能有一种方法可以通过平衡实现持久连接。 “哑巴”平衡器,如 SMTP 或 LDAP,按 TCP 连接选择目标,而不是基于请求。

例如,带有平衡器模块的 Apache HTTPd 服务器(请参阅 http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html)可以将每个请求(即使在持久连接上)分派(dispatch)到不同的服务器。

还要检查,您没有收到可能是 session 持久性的平衡器 cookie,因此原因不是持久连接,而是平衡器 cookie。

HTH,马克

关于java - Apache Http 客户端和负载平衡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29184813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com