我正在编写一个进程,该进程必须连接(并保持活动)几个(数百个)远程对等端,并管理对它们的消息传递/控制。
我制作了这个软件的两个版本:第一个使用经典的“每个连接线程”模型,第二个使用标准的Java NIO和选择器(减少线程分配,但有问题)。然后,环顾四周,我发现在大多数情况下,Netty可以提升很多,我开始使用它进行第三次。我的目标是保持资源使用率很低,保持快速。
一旦用自定义事件和动态处理程序切换编写了管道工厂,我就停止了最肤浅的部分:它的分配。
我读过的所有示例都使用单个客户端进行单一连接,因此我怀疑:我设置了ChannelFactory
和PipelineFactory
,因此每个(new ClientBootstrap(factory)).connect(address)
都会创建一个新频道用新的管道。是否可以创建共享管道并将业务逻辑推迟到线程池?
如果是这样,怎么样?
使用标准的Java NIO我设法使用了两个利用选择器的小型小线程池(线程<远程对等体);然而,我在回收听取的写作频道方面遇到了麻烦。
通信应通过单个通道进行,该通道可以从远程对等方接收定时消息或进行3向控制(命令-ack-ok)。
另一方面:一旦事件到达最后一个处理程序,会发生什么?是我在那里提取它还是可以从任何一点提取消息?
答案 0 :(得分:1)
你应该只有一个bootstrap(即一个ChannelFactory和一个PipeLineFactory)。管道甚至单个通道处理程序可以共享,但通常每个通道创建它们。
您可以在管道中安装ExecutionHandler,以将执行从IO工作线程转移到线程池。
但为什么不在http://netty.io/wiki/阅读详尽的文件?你会找到你那里的每一个问题的答案。