2016-09-12 3 views
2

ASP.NET 코어 웹 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

사용자 지정 헤더는 deserialization 등의 문제를 건너 뛰기 때문에 일반적으로 사용됩니다. 그러나 페이로드에서도이 헤더를 전달하지 않는 것이 좋습니다. 둘 다 가질 수는 없습니다. –

+0

@TomRedfern은 http 헤더에 맞춤 데이터를 추가하는 '일반적인 방법'입니까? – LP13

+0

@TomRedfern 각 서비스를 다양한 유형의 환경에 배포 할 수 있습니다. http 헤더에 사용자 정의 데이터를 추가하는 것이 호스트 서버에 의해 거부 될 수 있다는 우려가있었습니다. 호스팅 서버는 일반적으로 알 수없는 헤더를 확인합니까? – LP13

답변

0

상관 관계 식별자는 사용자가 직접 추가해야하는 것이 아닙니다. 메시지를 보내는 일부 프레임 워크가이를 수행해야합니다. 개발자는이를 잊을 수 없으며 모든 곳에서 일관된 동작을합니다.

MessageIdCorrelationId을 메시지의 헤더에 넣으십시오. 첫 번째 메시지에서 둘 다 동일합니다. 두 번째 메시지에서 CorrelationId은 이전의 MessageId으로 설정됩니다.

변경하지 않고 고유 한 ConversationId을 설정하여 한 발신자로부터 생성되는 모든 메시지를 추적 할 수도 있습니다. pub/sub를 사용하거나 메시지 발신자에게 다시 전화 할 때 유용합니다.

관련 문제