从 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 中的多路复用通道交付的主要内容,如果未能解决你的问题,请参考以下文章

从网络I/O模型到Netty,先深入了解下I/O多路复用

Java多线程:Linux多路复用,Java NIO与Netty简述

NIO和IO多路复用

TCP的多路复用和分解

IO多路复用深入浅出

netty为什么非阻塞