Netty通道管道是否在同一线程上执行?

3

我正在使用 Netty 4.1.3-Final 和 Logback 1.1.7, 希望使用 MDC 存储一些关于客户端连接的附加信息(IP地址,客户端标识等),以便将它们包含在日志中。

Logback(和Log4J)的MDC框架假定每个客户端都在使用多个线程,并且映射的诊断上下文是按线程基础维护的。当然,在现代事件驱动的框架(如Netty)中,这并不完全正确,因为它们利用异步非阻塞事件并重用同一个线程池。

我想引入两个处理程序,在管道的开头添加一个处理程序,添加MDC信息,在管道的末尾添加另一个处理程序,然后清除它。每个处理程序可以是入站/出站处理程序,以便处理入站和出站消息(显然对于出站数据,由于在Netty中反向调用管道,它们会相互执行相反的操作)。

可以假设同一通道中的Netty通道处理程序由同一线程处理吗?
它们是否原子地处理,没有机会在经过管道时使用同一线程用于另一个通道?
如果我正在使用LengthFieldBasedFrameDecoder来重新组装分段帧,在这种情况下会发生什么?
如果这种方法不起作用,是否有任何其他建议或更安全的方法?(我正在考虑让我的处理程序扩展一些通用基础处理程序,该处理程序在channelRead的开头设置MDC,并在其末尾删除它,但是这意味着如果我使用其他处理程序,例如Netty ReadTimeoutHandler,它们将无法获得MDC,因为它不会在整个管道中设置。)
在这种情况下使用的正确方法是什么?

1
在我看来,是的。当你调试一个Netty项目时,你会看到每个当前打开的会话/连接都有一个单独的线程。由于会话/连接始终有它自己的上下文,因此当Netty调用sessionOpened时,可以直接将MDC信息添加到上下文中。 - Herr Derb
1个回答

0

我们也遇到了您的需求。通过将地图作为参数传递给每个异步调用中的MDC来解决,被调用方然后再次将传递的参数放入其线程本地MDC中!我认为在管道内,由于我们使用Netty作为NIO模型,Netty出站处理程序在不同的线程中执行!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接