【发布时间】:2016-03-20 14:47:58
【问题描述】:
我正在使用Netty 编写一个UDP 负载平衡器。
负载平衡器侦听本地传输地址。就Netty 而言,仅创建一个Channel 以侦听此地址。传入的 UDP 数据包然后由(单线程事件循环组的)单线程分派到工作线程池进行处理(这里,处理意味着执行负载平衡)。
在出站端,有多个服务器可用。对于每个接收到的 UDP 数据包,相关的工作线程选择一个服务器并将 UDP 数据包转发到该服务器。为了转发 UDP 数据包,需要一个Channel。
我可以看到四种方法:
- 使用单个出站
Channel用于将所有数据包转发到服务器。使用这种方法,数据包将始终从相同的传输地址发送。 - 每个可用服务器使用一个出站
Channel。转发到服务器的每个数据包都将使用与该服务器关联的Channel进行转发。 - 对每个可用服务器使用 N 出站
Channel。转发到服务器的每个数据包都将使用与该服务器关联的Channels组中的Channel转发。 - 为每个要转发的数据包使用新的
Channel。
我尝试了方法 4,但我发现它的性能很差。特别是,我遇到了一个问题,即创建了太多的套接字,因此它超出了打开文件的限制。
因为Channels 在多个数据包之间共享,所以方法 1、2 和 3 需要在 UDP 数据包中添加请求的发件人地址,但这对我来说不是问题,因为我需要此信息用于实际处理数据包。
在 1、2 和 3 之间推荐的方法是什么?每个目标服务器使用一个或多个Channel 是一种好习惯吗?
编辑:
我想到的另一种方法是使用Channels 的共享池。当接收到 UDP 数据包时,会选择一个可用的服务器,然后从池中选择一个Channel(例如使用循环选择算法)并使用此Channel 转发数据包。
【问题讨论】:
标签: java multithreading udp netty