使用 MDC 或 Threadlocal

Using MDC or Threadlocal

我想在使用 http 调用它们时将从我的 Nginx 接收到的 X-Request-Id 传播到我的 k8s 中的其他服务。

现在,我正在使用请求过滤器来捕获 X-Request-Id header 并将其放入 MDC。

        final String nginxRequestId = requestContext.getHeaderString("X-Request-Id");
        if (nginxRequestId != null) {
            MDC.put("infra_request", nginxRequestId);
        }

现在,我在 k8s 中调用服务 B 的端点(所以没有 Nginx 挡路),我想获得 X-Request-Id 以将其放入请求的 header.我可以在这里看到两个选项:

  1. 只需从 MDC 获取该值
  2. 除了将 header 存储在 MDC
  3. 中外,还将其存储在线程局部变量中(因为服务正在使用 Dropwizard)

我可能会使用 MDC 来做到这一点,但我不确定这是否是最佳做法,或者是否可以 catch/problems 这样做。

我认为就您的目的而言,使用 MDC 比较好。 MDC 在内部使用 ThreadLocal。即使您使用 ThreadLocal,为了更好的实现方式,您也会将 ThreadLocal 变量包装在 class 中。 MDC 为您做同样的事情。

为了将 transaction-id 传递给 headers 的类似目的,我同时使用了 MDC 和 ThreadLocal。在内部,MDC 使用 ThreadLocal 并且它具有一些预定义的功能,例如为每个日志添加前缀。如果您放置的数据具有某些业务用途,我建议使用 ThreadLocal,否则,您可以使用 MDC。