由于Netty Channel使用单个线程进行入站和出站处理,因此我很想知道在使用多路复用协议(例如SPDY)时传送入站数据的推荐做法。想到的几个选项:
1)使用通道线程将所有流的数据传送到应用程序(即非通道代码)。在这种情况下,交付不会产生额外的上下文切换。应用程序必须知道将任何繁重的工作推迟到自己的线程上才能成为一个好的消费者"。如果它没有,它可以有效地阻止通道上的任何写入发生一段时间(因为读取和写入都使用相同的线程)。
2)使用单独的Executor(可选地每个流具有线程亲和性)。在这种情况下,我们会在早期发生上下文切换。阻止传递线程的应用程序不会阻止Netty的管道。这样做的缺点是某些(可能很多)情况下的应用程序逻辑可能相当轻,并且可能无法保证上下文切换。
3)引入一个多线程EventLoop,每个流具有线程亲和性。然而,这似乎违反了当前的假设,即Channel是单线程的。我不确定这是否可行。也许对Netty内部有更多了解的人可以确认?
有没有人知道其他注意事项或有其他我错过的选项?
答案 0 :(得分:1)
你可以做的是把#34;应用程序逻辑" (这将阻止io线程)进入额外的ChannelHandler并使用自定义EventExecutorGroup将其添加到ChannelPipeline。这样,处理从EventLoop移动到EventExecutorGroup提供的EventExecutor。