如何在微服务架构中包含CorrelationId?

LP1*_*P13 5 microservices asp.net-core-webapi

我正在使用 ASP.NET Core Web api 创建微服务架构。所有服务都是相互解耦的,并且可以部署在不同的环境中。每个服务都有自己的日志记录。当请求流经这些服务时,任何服务都可能失败,我们需要一种将一系列事件追溯到源的方法,即使这意味着遍历多个服务。
因此,为了处理此问题,发起请求的服务会创建一个 CorrelationId 并将其传递给下一个服务。第二个服务将其传递给第三个服务,依此类推。如果发生异常,相应的服务将记录异常消息以及 CorrelationId。

我想知道服务调用者传递关联 ID 的最佳位置是什么?

调用者应该在 HttpHeader 中传递 correlationid 还是应该将其作为部分方法参数传递,如下所示

这是被调用的服务

 public class RequestDTO
 {
    public string CorrelationId {get;set;}
    public string SomeOtherData {get;set;}
 }

 public Service2Controller:Controller
 {
    public Task<in> DoSomething(RequestDTO request)
    {
         // add the correlationid in current request Items collection
         // So global exception handling can access it and log it 
         // along with the exception

         HttpContext.Items.Add("CorrelationId", request.CorrelationId);
    }
 }
Run Code Online (Sandbox Code Playgroud)

在上述方法中,如果在调用此方法之前存在异常,则 CorrelationId 将不可用于全局异常处理程序进行日志记录。

有什么建议么?或替代方法

Den*_*elt 0

相关标识符不应该是您自己添加的内容,发送消息的某些框架应该执行此操作。这样开发人员就不会忘记它,并且它在各处都有一致的行为。

在邮件标题中添加“MessageId和” 。CorrelationId在第一条消息中,两者都是相同的。在第二条消息中,CorrelationId设置为MessageId前一条消息的消息。

您还可以设置一个ConversationId永不更改的唯一值,以跟踪从一个发起者生成的所有消息。在使用发布/订阅和/或回拨消息的发起者时很有用。