当前位置: 首页 > 知识库问答 >
问题:

Spring boot 2.1.5,WebFlux,Reactor:如何正确处理MDC

乌甫
2023-03-14

Spring靴2.1.5项目Reactor3.2.9

我正在使用上述框架设置一系列rest反应式API,我在MDC(映射诊断上下文)方面遇到了一个恼人的问题。我的应用程序是JAVA的。

MDC依赖于线程局部变量来存储要放入日志中的当前查询的映射上下文。显然,这个系统并不完美,而且与反应模式相矛盾,因为执行的不同步骤将通过不同的线程执行。

我在Play Responsive框架中遇到了同样的问题,但通过将映射的上下文透明地从一个参与者复制到另一个参与者,我找到了一个解决方法。

对于spring和reactor,我还没有找到令人满意的解决方案。

在网上找到的一些随机例子:

首先,它是有效的,但会迫使你使用一系列实用的方法

同样的事

第二,它试图在onNext publisher活动期间复制上下文,但在复制过程中似乎丢失了一些功能。例如,信号上下文丢失。

我需要一个适当的解决方案来解决这个问题:

  • 一个可以连接MDC和Reactor的图书馆
  • 一种调整Reactor/Spring以透明方式实现的方法
  • 有什么建议吗

共有1个答案

柳涵映
2023-03-14

“我还没有找到令人满意的解决方案。”

使用上下文是目前唯一的解决方案。因为正如你所说,threadlocals违背了与反应性编程相关的一切。在请求过程中使用线程本地作为存储点是解决问题的一种资源繁重的方式,在我看来设计很差。除非日志框架自己想出更好的解决方案,否则我们开发人员必须通过上下文传递数据,以适应日志框架阻塞的性质。

反应式编程是编程界的一种范式转变。其他一些东西,比如使用threadlocal回滚事务的数据库驱动程序,也遇到了很大的麻烦。JDBC数据库驱动程序规范本质上被定义为阻塞,而atm。spring和R2DBC项目曾试图定义一个新的JDBC驱动程序规范,该规范本质上是无阻塞的。这意味着所有供应商都必须从头重写数据库驱动程序实现。

反应性程序是如此之新,以至于许多库需要重写整个代码库。我们所知道的日志框架需要从头开始重写,这是一项艰巨的任务。反应性的上下文实际上不应该出现在反应性编程中,它的实现只是为了适应MDC问题。

从一个线程到另一个线程传递数据实际上需要很大的开销。

那我们该怎么办?

  • 推动日志框架,和/或帮助日志框架重写代码
  • 接受没有“调整”会神奇地解决这个问题
  • 使用博客文章中建议的上下文和方式

项目Reactor环境

 类似资料:
  • 我们有一个应用程序,运行在和上。当响应客户机在请求完成前离开(k8s pod被杀死或客户机订阅被释放)时,我们看到服务器只是停止处理请求,不再看到与该请求相关的应用程序日志。但是,会打印一个跟踪日志,指示通道处于非活动状态并将被终止。 我们能做些什么来优雅地处理这次终止吗?理想情况下,我们希望响应来自Reactor的取消信号。

  • 问题内容: Java的I / O类,,,和他们的不同子类中都有一个可抛出的方法。 对于处理此类异常的正确方法是否存在共识? 我经常看到建议,只是默默地忽略它们,但这是错误的,至少在打开用于写的资源的情况下,关闭文件时出现问题可能意味着无法写入/发送未刷新的数据。 另一方面,在阅读资源时,我还不清楚为什么会抛出异常以及如何处理。 那么有什么标准建议吗? 问题答案: 记录下来。 您实际上不能 做任何事

  • 在我的REST API中,我有一个过滤器,该过滤器检查每个请求,以查看令牌是否是原样。下面是代码。 当用户登录到应用程序时,将调用上述代码。但是,令牌将在60分钟内过期。我知道,在令牌过期后,要么我必须带用户返回登录屏幕,要么刷新令牌。我把这里和这里的建议都看了一遍 但我不明白以下几点。 如何分配并将此令牌发送回用户?当前,当用户登录时,他将获得令牌并将其保存在一个变量中。为了使刷新的令牌工作,我

  • 我正在尝试使用Reactor Netty TcpClient以反应方式与主机交互,这可能是无法访问的。下面是通道初始化逻辑的示例: 我收到的输出: “inbound”和“outbound”有一个专门的方法来处理它们的错误,但是它们工作在一个连接实例之上,如果您得到“Connection timeout”,则不会创建该连接实例。 我试过: > 异常,我接收到的异常包装在“ErrorCallBacKn

  • 问题内容: 昨天我对一个问题的回答之一是建议我确保我的数据库可以正确处理UTF-8字符。我该如何使用MySQL? 问题答案: 更新: 简短答案-您几乎应该始终使用字符集和排序规则。 更改数据库: 看到: 亚伦对此答案的评论如何使MySQL正确处理UTF-8 utf8_general_ci和utf8_unicode_ci有什么区别 转换指南:https : //dev.mysql.com/doc/r

  • 在 node.js中,通常的做法是将错误消息作为回调函数的第一个参数返回。在纯JS中有许多解决方案(promise,步骤,seq等),但它们似乎都无法与ICS集成。在不损失太多可读性的情况下处理错误的正确解决方案是什么? 例如: