【问题标题】:Operators#lift: good idea for MDC logging?Operators#lift:MDC 日志记录的好主意?
【发布时间】:2021-01-07 23:23:05
【问题描述】:

Project Reactor 文档建议 MDC 日志记录采用以下模式:

.doOnEach(logOnNext(r -> LOG.debug("found restaurant {} for ${}", r.getName(), r.getPricePerPerson())))

为了避免包装每个日志调用,自定义订阅者在每个信号之前从 currentContext 填充 MDC,使用 Hooks.onEachOperator(Operators.lift(...) 添加)是个好主意吗?

我的主要问题是:

1.) 在每个信号之前填充 MDC 的成本,即使没有发生日志记录。

2.) 操作员融合:每个操作员上的Operators.lift(...) 是否有效地禁用操作员融合?尝试使用StepVerifier#expectFusion 进行快速测试似乎表明了这一点。如果这是真的,在实践中这对性能有多大影响?

感谢任何输入!

【问题讨论】:

    标签: java reactive-programming project-reactor mdc


    【解决方案1】:

    这是 Sleuth 最初通过Hooks.onEachOperator 采用的方法。但是,如果您只需要对反应式管道中的一部分操作进行日志记录/MDC,这非常成本很高,可能不值得。更不用说这种方法不仅会影响您定义的响应式步骤,还会影响任何其他库/框架。

    提出建议是有原因的:更好的控制、更少的影响和更明确的方法。

    【讨论】:

    • 有什么高性价比的MDC登录方式?
    • Reactor 中的线程可以并且将被并发运行的多个 Flux 重用(例如,使用 Schedulers.parallel() 的两个不同的 Flux)因此任何 ThreadLocal(其中MDC 基于)在每个onNext 信号周围设置然后清除。您可以有一个辅助方法来填充 MDC、执行日志记录并清除 MDC,所有这些都在 doOnEach 运算符中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多