UDP负载均衡器使用Netty

时间:2016-03-20 14:47:59

标签: java multithreading udp netty

我正在使用[103.92240800000013, 21.69931]撰写UDP负载均衡器。

负载均衡器侦听本地传输地址。就Netty而言,只有一个Netty被创建才能收听此地址。然后,单个线程(单线程事件循环组)将传入的UDP数据包分派到工作线程池进行处理(此处,处理意味着执行负载平衡)。

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

我可以看到四种方法:

  1. 使用单个出站Channel,用于将所有数据包转发到服务器。使用这种方法,数据包将始终从同一个传输地址发送。
  2. 每个可用服务器使用一个出站Channel。转发到服务器的每个数据包都将使用与该服务器关联的Channel进行转发。
  3. 每个可用服务器使用 N 出站Channel。转发到服务器的每个数据包都将使用与该服务器关联的Channel组中的Channel转发。
  4. 为每个数据包使用新的Channels转发。
  5. 我尝试了接近4,我发现它会产生糟糕的性能。特别是,我遇到了创建太多套接字的问题,因此它超出了打开文件限制。

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

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

    编辑

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

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我使用了Another approach。但是我没有为平衡器的性能问题选择Another approach,而是针对可用服务器的性能问题。

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