当前位置: 首页 > 知识库问答 >
问题:

Apache Http客户端和负载平衡器

苏昂雄
2023-03-14

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

我有一个使用循环算法的负载均衡服务器

---

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

现在,ApacheHttpClient在默认情况下创建了一个连接池(默认情况下每个路由2个)。由于我使用的是Http v1,所以默认情况下,这些连接是持久连接。1和我的服务器正在发送Connection:Keep Alive标头。

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

这造成了两个问题:

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

这绝对不是我们想要的行为。

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

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

我想要重用连接所带来的性能,但我希望它们能够实现适当的负载平衡。如果可能的话,我有没有想过如何用Apache Http客户端配置这个场景?


共有2个答案

白坚壁
2023-03-14

1 to@mp911de答案

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

周和安
2023-03-14

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

  1. HTTP重定向

在场景1和场景3中,您没有机会使用持久连接。如果负载平衡器像反向代理一样工作,那么可能有一种方法可以通过平衡实现持久连接。“哑”平衡器,如SMTP或LDAP,会根据每个TCP连接选择目标,而不是基于请求。

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

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

马克

 类似资料:
  • 我在kubernetes pods中使用带有Python的gRPC作为客户端/服务器......我希望能够启动多个相同类型的pod(gRPC服务器)并让客户端(随机)连接到它们。 我调度了10个服务器吊舱,并设置了一个“服务”来瞄准它们。然后,在客户端,我连接到服务的DNS名称——这意味着kubernetes应该进行负载平衡,并将我指向一个随机服务器pod。实际上,客户机调用gRPC函数(这很有效

  • Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。Feign已经使用Ribbon,所以如果您使用@FeignClient,则本节也适用。 Ribbon中的中心概念是指定客户端的概念。每个负载平衡器是组合的组合的一部分,它们一起工作以根据需要联系远程服务器,并且集合具有您将其作为应用程序开发人员(例如使用@FeignClient注释)的名称。Spring Cloud使

  • 使用Cloud Foundry功能“Polyglot”集成服务发现和通过内部路由在服务容器之间直接通信,负载平衡如何工作?Cloud Foundry是否负责负载平衡?有没有一种方法可以利用客户端负载平衡,比如在这种支持Polyglot的通信之上使用Ribbon?

  • 我一直在使用,Consul作为服务注册表,Ribbon作为负载均衡器。我目前正在使用spring-boot 2.3.10。释放。 我真的很喜欢spring-blod-feign-继承支持,在我的理解中,它允许我编写服务器端和客户端使用的单个接口。 https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.

  • 我有两条溪流。一个是事件流,另一个是数据库更新流。我想用从DB更新流构建的信息丰富事件流。 事件流非常庞大,使用5个字段进行分区。这给了我很好的分配。DB流不那么喋喋不休,并且使用两个字段进行分区。我目前正在使用两个公共字段连接这两个流,并使用flapMap来丰富第一个流。flatMap运算符使用ValueState维护状态,状态由两个公共字段自动键入。 除了实现自定义逻辑来手动提取键并更新维护状

  • 目标:将弹性/静态IP分配给负载平衡器(LB),以服务于处理DNS(端口53)、HTTPS(端口443)、HTTP(端口80)的EC2实例。 需要静态IP来正确配置DNS记录(即A记录)。需要在后端/服务器上终止TLS,以提供无限制的 经典的负载平衡器允许自定义安全规则,并允许在EC2实例上终止SSL。问题是静态IP不能分配给经典LB,只能分配给其中的单个实例,这无法平衡负载。 要分配静态IP,我