【问题标题】:Delivery from multiplexed channels in Netty 5从 Netty 5 中的多路复用通道交付
【发布时间】:2014-07-27 00:57:12
【问题描述】:

由于 Netty 通道使用单个线程进行入站和出站处理,我很想知道在使用多路复用协议(例如 SPDY)时传递入站数据的推荐做法。想到的几个选项:

1) 使用通道线程将所有流的数据传递给应用程序(即非通道代码)。在这种情况下,交付不会导致额外的上下文切换。应用程序必须知道将任何繁重的工作推迟到自己的线程上,才能成为“好消费者”。如果没有,它可以有效地阻止通道上的任何写入发生一段时间(因为读取和写入都使用同一个线程)。

2) 使用单独的 Executor 交付(可选地,每个流都有线程关联)。在这种情况下,我们会提前进行上下文切换。阻塞传递线程的应用程序不会阻塞 Netty 的管道。这样做的缺点是,在某些(可能很多)情况下,应用程序逻辑可能相当轻量级,并且可能不保证上下文切换。

3) 引入一个多线程 EventLoop,每个流都有线程关联。然而,这似乎违反了 Channel 是单线程的当前假设。我不确定这是否可行。也许对 Netty 内部有更多了解的人可以确认一下?

是否有人知道我遗漏的其他注意事项或其他选项?

【问题讨论】:

    标签: java netty spdy


    【解决方案1】:

    您可以做的是将“应用程序逻辑”(会阻塞 io 线程)放入额外的 ChannelHandler 中,并使用自定义 EventExecutorGroup 将其添加到 ChannelPipeline。这样,处理就从 EventLoop 转移到 EventExecutorGroup 之外提供的 EventExecutor。

    【讨论】:

    • 好吧,这是有道理的。因此,这似乎本质上是#2 的变体。我是否认为 #3 在 Netty 5.x 中根本不起作用?
    猜你喜欢
    • 2013-03-08
    • 2015-10-09
    • 2013-10-12
    • 2018-01-15
    • 2012-11-02
    • 1970-01-01
    • 2017-11-19
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多