Java 使用Netty的UDP负载均衡器

Java 使用Netty的UDP负载均衡器,java,multithreading,udp,netty,Java,Multithreading,Udp,Netty,我正在使用Netty编写一个UDP负载平衡器 负载平衡器侦听本地传输地址。对于Netty,只创建了一个频道,以便监听此地址。然后,传入的UDP数据包由单线程(单线程事件循环组的)调度到工作线程池中进行处理(这里,处理意味着执行负载平衡) 在出站端,有多台服务器可用。对于每个接收到的UDP数据包,关联的工作线程选择一个服务器并将UDP数据包转发到此服务器。为了转发UDP数据包,需要一个通道 我可以看到四种方法: 使用单个出站通道,用于将所有数据包转发到服务器。使用这种方法,数据包将始终从相同的传输

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

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

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

我可以看到四种方法:

  • 使用单个出站
    通道
    ,用于将所有数据包转发到服务器。使用这种方法,数据包将始终从相同的传输地址发送
  • 每个可用服务器使用一个出站
    频道。转发到服务器的每个数据包都将使用与该服务器关联的
    通道
    进行转发
  • 使用每个可用服务器的N出站
    频道。转发到服务器的每个数据包都将使用与该服务器关联的
    通道组中的
    通道进行转发
  • 为每个要转发的数据包使用新的
    通道
  • 我尝试了方法4,但我发现它的性能很差。特别是,我遇到了一个问题,创建了太多套接字,因此超出了打开文件的限制

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

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


    编辑


    我想到的另一种方法是使用共享的
    频道池。当接收到UDP数据包时,选择一个可用的服务器,然后从池中选择一个
    通道(例如,使用循环选择算法),并使用该
    通道转发数据包
    我与您有类似的问题,我使用
    另一种方法
    。但对于平衡器的性能问题,我并没有选择另一种方法,而是针对可用服务器的性能问题

    对于平衡器的性能,我没有注意到方法1和性能测试的另一种方法
    之间有多大区别。而且Netty有一个监听频道的上限速率,我认为你最好使用
    EpollChannelOption。所以\u REUSEPORT
    来创建多个监听频道