【问题标题】:UDP load balancer using Netty使用 Netty 的 UDP 负载均衡器
【发布时间】:2016-03-20 14:47:58
【问题描述】:

我正在使用Netty 编写一个UDP 负载平衡器。

负载平衡器侦听本地传输地址。就Netty 而言,仅创建一个Channel 以侦听此地址。传入的 UDP 数据包然后由(单线程事件循环组的)单线程分派到工作线程池进行处理(这里,处理意味着执行负载平衡)。

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

我可以看到四种方法:

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

我尝试了方法 4,但我发现它的性能很差。特别是,我遇到了一个问题,即创建了太多的套接字,因此它超出了打开文件的限制。

因为Channels 在多个数据包之间共享,所以方法 1、2 和 3 需要在 UDP 数据包中添加请求的发件人地址,但这对我来说不是问题,因为我需要此信息用于实际处理数据包。

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


编辑

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

【问题讨论】:

    标签: java multithreading udp netty


    【解决方案1】:

    我和你有类似的问题,我使用Another approach。但是我没有选择Another approach来解决平衡器的性能问题,而是选择了可用服务器的性能问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多