【问题标题】:Does the netty channel pipeline take place on the same thread?netty 通道管道是否发生在同一个线程上?
【发布时间】:2016-12-28 00:47:55
【问题描述】:

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

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

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

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

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

如果我使用LengthFieldBasedFrameDecoder 重新组合碎片帧,会发生什么情况?

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

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

【问题讨论】:

  • 在我看来,是的。在调试 netty 项目时,您会看到当前打开的每个会话/连接都有一个线程。由于会话/连接总是有它自己的上下文,当sessionOpened 被 netty 调用时,您可以将 MDC 信息直接添加到上下文中。

标签: java multithreading netty logback


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2019-04-25
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多