2016-09-12 5 views
2

Ich erstelle eine Microservices-Architektur mit ASP.NET Core Web API. Alle Dienste sind voneinander entkoppelt und können in verschiedenen Umgebungen bereitgestellt werden. Jeder Dienst verfügt über eine eigene Protokollierung. Wenn Anforderungen durch diese Dienste fließen, können sie in einem der Dienste fehlschlagen. Wir benötigen eine Möglichkeit, eine Reihe von Ereignissen zurück zur Quelle zu verfolgen, selbst wenn dies bedeutet, dass mehrere Dienste durchlaufen werden müssen.
Um dieses Problem zu beheben, erstellt der Dienst, der die Anforderung auslöst, eine CorrelationId und übergibt sie an den nächsten Dienst. Der 2. Service gibt es zum 3. Service und so weiter. Wenn eine Ausnahme auftritt, protokolliert der entsprechende Dienst die Ausnahmebedingungsnachricht zusammen mit CorrelationId.Wie CorrelationId in Microservice-Architektur enthalten?

Ich wollte wissen, was wäre der beste Ort für den Anrufer des Dienstes, um die Korrelationsidentifikation zu übergeben?

Sollte der Anrufer in Httpheader oder sollte es als Teil Methodenparameter so etwas wie unten

Dies ist der Dienst Passe Passe CorrelationId die

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); 
    } 
} 

im Ansatz genannt wird, immer oben, wenn Es gibt eine Ausnahme, bevor diese Methode aufgerufen wird. Die CorrelationId ist für den globalen Ausnahmehandler für die Protokollierung nicht verfügbar.

Irgendwelche Vorschläge? oder alternativer Ansatz

+0

Ein benutzerdefinierter Header ist üblich, da er Probleme bei der Deserialisierung etc. umgeht. Warum aber nicht auch in der Payload übergeben? Kein Grund, warum du nicht beides haben kannst. –

+0

@TomRedfern ist es 'typisch', benutzerdefinierte Daten in http-Headern einzufügen? – LP13

+0

@TomRedfern kann jeder Dienst in verschiedenen Umgebungstypen bereitgestellt werden. Mein Anliegen war das Hinzufügen von benutzerdefinierten Daten in HTTP-Header möglicherweise vom Host-Server verweigert werden. Prüft der Hostserver normalerweise unbekannte Header? – LP13

Antwort

0

Der Korrelationsbezeichner sollte nicht etwas sein, das Sie selbst hinzufügen, ein Framework, das die Nachrichten sendet, sollte dies tun. Auf diese Weise kann ein Entwickler es nicht vergessen und es hat überall ein konsistentes Verhalten.

Setzen Sie eine und CorrelationId in die Header der Nachricht. Bei der ersten Nachricht sind beide gleich. Bei der zweiten Nachricht wird CorrelationId auf der vorherigen Nachricht gesetzt.

Sie können auch einen eindeutigen ConversationId festlegen, der sich nie ändert, um alle Nachrichten zu verfolgen, die von einem Absender stammen. Nützlich bei Verwendung von Pub/Sub und/oder Zurückrufen an den Absender einer Nachricht.

Verwandte Themen