【问题标题】:How to properly deal with Correlation IDs?如何正确处理相关 ID?
【发布时间】:2020-07-10 15:45:33
【问题描述】:

我刚刚阅读了微服务架构中的日志记录,似乎有这个 Correlation ID 的概念,它基本上传递给每个微服务。此 Correlation ID 可用于记录日志 - 您只需搜索 Correlation ID 即可跨微服务跟踪请求。

我的问题是,这通常是如何实现的?此关联 ID 是在哪里生成的?您是否在前端生成某种 UUID,并通过 X-REQUEST-ID HTTP 标头传递它?

我的第二个问题是:当您在服务器中收到这个 Correlation ID 时,如何让服务器中的所有功能都可以访问它?

假设你的服务器有这样的东西:

requestHandler(httpRequest) {
    correlationId = httpRequest.header.get(X-REQUEST-ID)
    ...
    function2()
}

function2() {
    ...
    function3()
}

function3() {
    ...
    function4()
}

function4() {
    ...
}

假设我想在 function4() 中记录一些内容(假设我希望日志也包含 Correlation ID),我真的必须将 Correlation ID 从 requestHandler() 一直向下传递到 function4() ?还是有更好的方法?

我的第一个想法是拥有某种内存键值数据库,您可以在其中将关联 ID 存储为值,但键是什么?

【问题讨论】:

  • 您的微服务中将使用哪种实际语言?
  • 在 Golang 中,我猜这个 RequestID 会附加到 Context 中,并且上下文会被传递到所有函数中。但是你将如何在 python Flask 微服务中做到这一点?

标签: microservices


【解决方案1】:

是的,它只是一种 UUID,每当前端向 API 网关或编排层发送请求时,都会生成此 UUID 并将其添加到后续调用中,以对每个要跟踪的微服务进行调用。

因此,如果您通过某个消息传递代理进行同步调用或异步调用,那么您应该始终将其嵌入到标头中,并且被调用的函数只会在开始时将其放入日志记录中,稍后您会使用此相关 ID可以拦截日志客户端中的调用流。

【讨论】:

  • 啊,我明白了,谢谢。关于第二个问题有什么建议吗?
  • 是的,我也添加了与此相关的信息。您必须在每次通话中添加 CorrID,如果它看起来是,请务必将其标记为有用
  • 我不太确定我是否理解,所以您会将 Correlation ID 从 requestHandler() 函数一直向下传递到 function4() 吗?
  • 您正在研究基于 kubernetes 的环境吗?如果是,请检查 Jaeger,它是一个负责分布式跟踪的实用程序
  • 但是当您开始将 UUID 作为参数传递给所有需要记录的函数(及其所有祖先)时,代码不会变得非常难看吗?我假设大多数函数都需要记录,并且您必须将 UUID 传递给应用程序中的每个函数 - 这感觉真的很难看。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多