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

使用Netty的UDP负载平衡器

呼延烈
2023-03-14

我正在使用Netty编写UDP负载均衡器。

负载平衡器侦听本地传输地址。就Netty而言,只创建了一个频道来监听该地址。然后,(单线程事件循环组的)单线程将传入的UDP数据包调度到工作线程池进行处理(这里,处理意味着执行负载平衡)。

在出站端,可以使用多个服务器。对于每个接收到的UDP数据包,关联的工作线程选择一个服务器,并将UDP数据包转发到此服务器。为了转发UDP数据包,需要一个通道。

我可以看到四种方法:

  1. 使用单个出站通道,用于将所有数据包转发到服务器。使用这种方法,数据包将始终从相同的传输地址发送
  2. 每个可用服务器使用一个出站通道。转发到服务器的每个数据包都将使用与该服务器关联的通道进行转发
  3. 每个可用服务器使用N个出站通道。转发到服务器的每个数据包都将使用与该服务器相关联的信道组中的信道进行转发
  4. 对每个要转发的数据包使用新的信道

我尝试了方法4,我可以看到它产生了糟糕的性能。特别是,我遇到了创建了太多套接字的问题,因此它超过了打开文件的限制。

因为通道在多个数据包之间共享,方法1、2和3需要在UDP数据包中添加请求的发送者地址,但这对我来说不是问题,因为我需要实际处理数据包的服务器的这些信息。

1、2和3之间的推荐方法是什么?每个目标服务器使用一个或多个Channel是好做法吗?

编辑:

我想到的另一种方法是使用共享的通道池。当接收到UDP数据包时,选择可用的服务器,然后从池中选择通道(例如使用循环选择算法),并使用该通道转发数据包。

共有1个答案

邹俊拔
2023-03-14

我和你有一个类似的问题,我使用另一种方法。但对于平衡器的性能问题,我并没有选择另一种方法,而是针对可用服务器的性能问题。

对于平衡器的性能,我没有注意到方法1和性能测试的另一种方法之间有太大的差异。Netty有一个监听通道的上限速率,我认为你最好使用EpollChannelOption。SO_REUSEPORT创建多个收听频道。

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

  • 我是微服务的新手。(学习阶段)。我有一个问题。我们在云中部署微服务。(例如 AWS)。云已经提供了负载平衡和日志。我们还在Spring Boot中实现了负载平衡(功能区)和日志(Rabbit MQ和Zipkin)。这两种实现有什么区别?我们两者都需要吗?有些人可以回答这些问题吗? 提前感谢。

  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。

  • web-service预期会有很多调用,而我希望在出现故障时使该服务成为冗余,因此我希望有两个实例同时运行以处理所有请求。 1)让两个级别的Web服务同时处理请求的最佳方法是什么?使用外部负载均衡器还是使用AKKA/AKKA-HTTP中的某种魔法(我不知道)? 2)我必须调整哪些主要参数来提高性能?

  • 我们面临着 ActiveMQ - M 集合负载平衡的几个问题。有人可以帮忙吗?以下是我们的设置 MCO在故障转移池-Broker1中配置了两个ActiveMQ代理 经纪人1 问题1:MCO客户端在broker1和broker2之间的负载平衡和连接不相等。700 MCO连接到broker1,而只有100 MCO连接至broker2。我们是否缺少此负载平衡的任何属性? 问题 2: 当我们添加新的代理(

  • 我用JMeter创建了测试来测试幽灵博客平台的性能。Ghost是用Node.js编写的,安装在云服务器上,有1GB的内存和1个CPU。 我注意到在400个并发用户之后JMeter得到错误。到400个并发用户的负载是正常的。我决定增加CPU,增加了1个CPU。 但是错误重现并添加了2个CPU,总共4个CPU。问题发生在400个并发用户之后。 我想知道是否有可能平衡CPU之间的负载?