应用程序在频道之间交换数据很常见。
例如,对于代理服务器,每个入站连接都将与出站连接和它们之间交换的数据相关联。在这种情况下,我知道我可以构建一个客户端BootStrap
并执行b.group(inboundChannel.eventLoop());
。然后两个通道都可以在同一个线程中处理。
但是入站渠道之间的数据交换呢?聊天室是典型案例。耦合是任意的,对于恰好具有不同EventLoop
线程的两个通道,它们将支付不必要的上下文切换开销。
所以我很困惑为什么存在这样的规则?我是否可以将数据写入Channel
套接字(可能具有锁定保持),如果写入可以在任何调用线程中进行非阻塞(OS套接字缓冲区具有可用空间或对等体消耗速度快),并且如果它会阻塞,然后我们可以触发EventLoop
线程将写位注册到选择器吗?
答案 0 :(得分:0)
它只是在Netty中完成的设计选择,它还简化了自定义ChannelHandler
的编写。总是调度到EventLoop
入站和出站处理程序在执行这些语句时具有相同的语义,因此用户基本上可以将其处理程序编写为“单线程”。
由于这是netty的“核心”,因此无法改变这一点。