从 Netty 5 中的多路复用通道交付
Posted
技术标签:
【中文标题】从 Netty 5 中的多路复用通道交付【英文标题】:Delivery from multiplexed channels in Netty 5 【发布时间】:2014-07-27 00:57:12 【问题描述】:由于 Netty 通道使用单个线程进行入站和出站处理,我很想知道在使用多路复用协议(例如 SPDY)时传递入站数据的推荐做法。想到的几个选项:
1) 使用通道线程将所有流的数据传递给应用程序(即非通道代码)。在这种情况下,交付不会导致额外的上下文切换。应用程序必须知道将任何繁重的工作推迟到自己的线程上,才能成为“好消费者”。如果没有,它可以有效地阻止通道上的任何写入发生一段时间(因为读取和写入都使用同一个线程)。
2) 使用单独的 Executor 交付(可选地,每个流都有线程关联)。在这种情况下,我们会提前进行上下文切换。阻塞传递线程的应用程序不会阻塞 Netty 的管道。这样做的缺点是,在某些(可能很多)情况下,应用程序逻辑可能相当轻量级,并且可能不保证上下文切换。
3) 引入一个多线程 EventLoop,每个流都有线程关联。然而,这似乎违反了 Channel 是单线程的当前假设。我不确定这是否可行。也许对 Netty 内部有更多了解的人可以确认一下?
是否有人知道我遗漏的其他注意事项或其他选项?
【问题讨论】:
【参考方案1】:您可以做的是将“应用程序逻辑”(会阻塞 io 线程)放入额外的 ChannelHandler 中,并使用自定义 EventExecutorGroup 将其添加到 ChannelPipeline。这样,处理就从 EventLoop 转移到 EventExecutorGroup 之外提供的 EventExecutor。
【讨论】:
好吧,这是有道理的。因此,这似乎本质上是#2 的变体。我是否认为 #3 在 Netty 5.x 中根本不起作用?以上是关于从 Netty 5 中的多路复用通道交付的主要内容,如果未能解决你的问题,请参考以下文章