2016-09-12 4 views
2

Я создаю архитектуру микросервисов, используя ASP.NET Core web api. Все службы отделены друг от друга и могут быть развернуты в разных средах. У каждого сервиса есть своя регистрация. Когда запросы протекают через эти службы, он может выйти из строя в любом из сервисов. Нам нужен способ отслеживания серии событий обратно в исходный код, даже если это означает пересечение нескольких служб.
Чтобы справиться с этой проблемой, служба, которая отправляет запрос, создает CorrelationId и передает ее следующей службе. Вторая услуга передает ее третьей службе и так далее. Если возникает исключение, соответствующая служба будет записывать сообщение об исключении вместе с CorrelationId.Как включить CorrelationId в архитектуру микросервиса?

Я хотел знать, что было бы лучшим местом для звонящего в службу, чтобы передать коррелиру?

Если вызывающий пропуск CorrelationId в HTTPHeader или он должен передать его как часть параметра метод что-то вроде ниже

Это сервис, который вызывался

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

@TomRedfern «типично» добавлять пользовательские данные в заголовки http? – LP13

+0

@TomRedfern каждая служба может быть развернута в разных типах среды. Мое беспокойство заключалось в добавлении пользовательских данных в заголовки http, которые могут быть лишены хост-сервером. Обычно сервер хостинга проверяет неизвестные заголовки? – LP13

ответ

0

Идентификатор корреляции не должен быть чем-то, что вы добавляете самостоятельно, некоторые рамки, которые отправляют сообщения, должны это делать. Таким образом, разработчик не может забыть об этом, и он имеет постоянное поведение повсюду.

Поместите MessageId и CorrelationId в заголовки сообщения. При первом сообщении оба будут одинаковыми. Во втором сообщении CorrelationId установлено на MessageId предыдущего.

Вы также можете установить уникальный ConversationId, который никогда не изменяется, чтобы отслеживать все сообщения, нерестущие от одного отправителя. Полезно при использовании pub/sub и/или обратного вызова отправителю сообщения.