我正在使用ASP.NET Core web api创建一个微服务架构。所有服务都相互分离,可以部署在不同的环境中。每个服务都有自己的日志记录。当请求流经这些服务时,它可能在任何服务中失败,我们需要一种将一系列事件追溯到源的方法,即使它意味着遍历多个服务。 因此,要处理此问题,发起请求的服务会创建CorrelationId并将其传递给下一个服务。第二个服务将其传递给第三服务,依此类推。如果发生异常,相应的服务将记录异常消息以及CorrelationId。
我想知道服务调用者传递correlationid的最佳位置是什么?
调用者应该在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);
}
}
在上面的方法中,如果在调用此方法之前存在异常,则CorrelationId将不可用于记录的全局异常处理程序。
有什么建议吗?或替代方法
答案 0 :(得分:0)
相关标识符不应该是您自己添加的内容,发送消息的某个框架应该这样做。这样开发人员就不会忘记它,并且它在整个地方都有一致的行为。
在邮件的标题中加上MessageId
和CorrelationId
。在第一条消息上,两者都是相同的。在第二条消息中,CorrelationId
设置为前一个MessageId
。
您还可以设置永不更改的唯一ConversationId
,以跟踪从一个发起人产生的所有消息。在使用pub / sub和/或回调消息的发起者时很有用。