如何正确处理Correlation IDs?

How to properly deal with Correlation IDs?

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

我的问题是,这通常是如何实施的?这个 Correlation ID 是在哪里生成的?您是否在前端生成某种 UUID,并通过 X-REQUEST-ID HTTP header?

传递它

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

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

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

function2() {
    ...
    function3()
}

function3() {
    ...
    function4()
}

function4() {
    ...
}

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

我的第一个想法是拥有某种 in-memory key-value 数据库,您可以在其中将相关 ID 作为值存储,但关键是什么?

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

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