使用 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.我可以在这里看到两个选项:
- 只需从 MDC 获取该值
- 除了将 header 存储在 MDC
中外,还将其存储在线程局部变量中(因为服务正在使用 Dropwizard)
我可能会使用 MDC 来做到这一点,但我不确定这是否是最佳做法,或者是否可以 catch/problems 这样做。
我认为就您的目的而言,使用 MDC 比较好。 MDC 在内部使用 ThreadLocal。即使您使用 ThreadLocal,为了更好的实现方式,您也会将 ThreadLocal 变量包装在 class 中。 MDC 为您做同样的事情。
为了将 transaction-id 传递给 headers 的类似目的,我同时使用了 MDC 和 ThreadLocal。在内部,MDC 使用 ThreadLocal 并且它具有一些预定义的功能,例如为每个日志添加前缀。如果您放置的数据具有某些业务用途,我建议使用 ThreadLocal,否则,您可以使用 MDC。
我想在使用 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.我可以在这里看到两个选项:
- 只需从 MDC 获取该值
- 除了将 header 存储在 MDC 中外,还将其存储在线程局部变量中(因为服务正在使用 Dropwizard)
我可能会使用 MDC 来做到这一点,但我不确定这是否是最佳做法,或者是否可以 catch/problems 这样做。
我认为就您的目的而言,使用 MDC 比较好。 MDC 在内部使用 ThreadLocal。即使您使用 ThreadLocal,为了更好的实现方式,您也会将 ThreadLocal 变量包装在 class 中。 MDC 为您做同样的事情。
为了将 transaction-id 传递给 headers 的类似目的,我同时使用了 MDC 和 ThreadLocal。在内部,MDC 使用 ThreadLocal 并且它具有一些预定义的功能,例如为每个日志添加前缀。如果您放置的数据具有某些业务用途,我建议使用 ThreadLocal,否则,您可以使用 MDC。