我正在使用[103.92240800000013, 21.69931]
撰写UDP
负载均衡器。
负载均衡器侦听本地传输地址。就Netty
而言,只有一个Netty
被创建才能收听此地址。然后,单个线程(单线程事件循环组)将传入的UDP数据包分派到工作线程池进行处理(此处,处理意味着执行负载平衡)。
在出站端,有多个服务器可用。对于每个收到的UDP数据包,关联的工作线程选择服务器并将UDP数据包转发到此服务器。为了转发UDP数据包,需要Channel
。
我可以看到四种方法:
Channel
,用于将所有数据包转发到服务器。使用这种方法,数据包将始终从同一个传输地址发送。Channel
。转发到服务器的每个数据包都将使用与该服务器关联的Channel
进行转发。Channel
。转发到服务器的每个数据包都将使用与该服务器关联的Channel
组中的Channel
转发。Channels
转发。我尝试了接近4,我发现它会产生糟糕的性能。特别是,我遇到了创建太多套接字的问题,因此它超出了打开文件限制。
由于Channel
在多个数据包之间共享,因此方法1,2和3需要在UDP数据包中添加请求的发件人地址,但这对我来说不是问题,因为我需要实际处理数据包的服务器的此信息。
1,2和3之间的推荐方法是什么?每个目标服务器使用一个或多个Channels
是一种好习惯吗?
编辑:
我想到的另一种方法是使用Channel
的共享池。收到UDP数据包后,会选择一个可用服务器,然后从池中选择Channels
(例如,使用循环选择算法),并使用此Channel
转发数据包。
答案 0 :(得分:0)
我遇到了类似的问题,我使用了Another approach
。但是我没有为平衡器的性能问题选择Another approach
,而是针对可用服务器的性能问题。
对于平衡器的性能,我没有注意到方法1和Another approach
之间的性能测试差异很大。 Netty有一个监听频道的上限速率,我认为你最好用EpollChannelOption.SO_REUSEPORT
创建多个监听频道。