netty渠道管道是否在同一个线程上进行?

时间:2016-08-21 10:11:49

标签: java multithreading netty logback

我正在使用Netty 4.1.3-Final with Logback 1.1.7,我希望使用MDC来存储有关客户端连接的一些其他信息(IP地址,客户端)标识符等),以便它们可以包含在日志中。

Logback(和Log4J)的MDC框架假设每个客户端都使用多个线程,并且基于每个线程维护映射的诊断上下文。当然,在像Netty这样的现代事件驱动框架中,这是不正确的,它使用异步非阻塞事件并重用相同的线程池。

我正在考虑引入2个处理程序,一个在管道的开头添加,并添加MDC信息,并添加到管道末尾,然后清除它。每个处理程序都可以是入站/出站处理程序,因此它可以处理入站和出站消息(显然,对于出站消息,它们彼此相反,因为在Netty中对出站数据反向调用管道。)

假设相同通道的管道中的Netty通道处理程序由同一个线程处理是否安全?

它们是否以原子方式处理而没有任何机会在通过管道时将相同的线程用于另一个通道?

如果我使用LengthFieldBasedFrameDecoder重新分配碎片帧怎么办?在这种情况下会发生什么?

如果这种方法不起作用,还有其他推荐或更安全的方法吗? (我正在考虑让我的处理程序扩展一些公共基本处理程序,而不是在channelRead的开头设置MDC并在它的末尾删除它,但这意味着如果我使用其他处理程序,如Netty {{ 3}},他们不会获得MDC,因为它不会在整个管道中被设置。)

在这种情况下使用的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我们也遇到了你的要求。通过在MDC中传输映射作为每个异步调用的参数来解决,然后被调用者再次将传递的参数放入其threadLocal MDC中!我认为在管道中,Netty出站处理程序执行期间可以使用不同的线程,因为我们使用Netty作为NIO模型!