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