2017-06-17 2 views
6

Wir haben eine Micro-Services-Architektur und wir haben einige Diskussionen darüber, wie wir interne Fehler dem Client aussetzen können.Gute Praktiken zur Verbreitung von Fehlern durch Micro Services

Hier ist ein Beispiel:

Nehmen wir an, wir 3 Dienstleistungen, Service A, B und C. Wenn der Client eine Anfrage an den Dienst A sendet, die öffentlich ist, dieser Dienst sendet eine Anforderung B Service das sendet eine Anfrage an Dienst C (die intern sind und Authentifizierung benötigt, aber die Anmeldeinformationen werden intern wie Umgebungsvariablen gespeichert, sie werden nicht vom Client gesendet).

Und aus irgendeinem Grund erhält die Kommunikation zwischen B und C eine 401 (könnte 422, 403 oder Client-bezogene Fehler sein), was bedeutet, dass die Anfrage nicht autorisiert wurde.

So etwas: enter image description here

Die Kommunikation zwischen B und C intern ist, der Benutzer nicht wissen, über diese Dienste. Sollte ich unsere interne Struktur offenlegen und 401 an den Kunden senden? Ist es nicht die Schuld des Kunden? Soll ich eine 500 senden?

+1

Wenn es nicht der Benutzerfehler ist, dann ist 5xx der richtige Antwortcodebereich. –

+0

@OliverCharlesworth Ich stimme dir zu, und sollte ich diesen Fehler intern protokollieren und keine Informationen für den Benutzer verfügbar machen? Was denken Sie? –

+2

Es kommt darauf an. Im Allgemeinen wird es jedoch als schlecht angesehen, interne Fehlerdetails (wie Stack-Traces) dem Benutzer zu offenbaren (sowohl von UX- als auch von Sicherheitssichtpunkten aus). Allenfalls eine Nachricht wie "500 Server Error - Ihre eindeutige Fehler-ID ist 123456", mit der Sie den Benutzer später in Ihren Fehlerprotokollen mit einer ID korrelieren können. –

Antwort

7

Es ist besser 500 Status explizit zu vermeiden, aber in einigen Fällen ist es notwendig. Ein Benutzer arbeitet mit Ihrem System nicht mit bestimmten Service und für ihn spielt es keine Rolle, was drin ist. Die interne Systemimplementierung kann variieren, aber die Benutzerinteraktion kann gleich bleiben.

Let's A wird zum Beispiel ein E-Commerce-Dienst, B-Billing-Service und C-Billing-Gateway sein. Der Benutzer kauft ein Produkt über A, das eine Abrechnungsanforderung an B sendet, und B kommuniziert mit C, um eine Transaktion durchzuführen. 401 zwischen B und C kann aus verschiedenen Gründen sein. Wenn es sich nur um ein internes Konfigurationsproblem handelt (nicht aktualisiertes Passwort, abgelaufenes Zertifikat usw.), handelt es sich um einen internen Systemfehler, und Sie müssen dem Benutzer mitteilen, dass der Dienst momentan nicht verfügbar ist oder etwas Ähnliches, um nicht alle internen Fehlerdetails zu übergeben. Sie können in diesem Fall 5xx-Code verwenden. Vielleicht kann Service B eine Anfrage an eine Art von Warteschlange stellen und Service A sagen, dass alles in Ordnung ist, Ihre Anfrage wird später bearbeitet. Aber wenn es wegen Benutzer versucht, schlechte Kreditkarte zu verwenden oder nicht genug Geld (nicht autorisierte Anfrage) A muss die richtige Nachricht und 4xx Response-Code zeigen.

Im Allgemeinen stellt ein Dienst Ressourcen zur Verfügung und es spielt keine Rolle, wie viele interne oder externe Dienste, Datenbanken, Datenquellen und so weiter dahinter stecken. Vielleicht bedeutet 401 zwischen B und C, dass B zu D-Dienst geht (C-Alternative) und ein Dienst sollte überhaupt nicht über 401 wissen. Es hängt also davon ab, was Sie dem Benutzer zur Verfügung stellen müssen und wie Sie mit verschiedenen Fällen umgehen müssen.

2

Ihr Diagramm macht wenig Sinn. Der eingehende Anruf ist nicht 200, bis er erfolgreich zu dem Benutzer zurückkehrt, nachdem alle internen Dienste aufgerufen werden.

Wenn die Authentifizierung zwischen B und C intern ist (Server-zu-Server-Authentifizierung), haben Sie einen internen Fehler, und 502 ist eine vernünftige Wahl für die Rückkehr zu A. Natürlich könnten Sie versuchen, den Server A erneut zu versuchen. wie du einen 502 von B bekommen hast, aber es ist sinnlos, weil es ein abgelaufenes Token ist. Sie können also als Richtlinie entscheiden, dass interne 401s wieder an A eskaliert werden sollen. Oder Sie finden möglicherweise, dass die Anfügung von Metadaten im Fehlerantwort-Body 502 einen Wiederholungsmechanismus unterstützt. Wie auch immer, die Server-Server-Authentifizierung sollte nicht fehlschlagen, wenn es sich um einen gültigen Anruf handelt.

Also ... wenn die C-Authentifizierung mit dem vom Benutzer bereitgestellten Token funktioniert, lief die Authentifizierung des Benutzers während des Aufrufs ab (selten, aber passiert) - in diesem Fall hätte das Token zuvor an anderer Stelle im System erweitert werden müssen dieser Anruf (wahrscheinlich in A's Anruf an SSO). Aber es war nicht, also geben Sie 401 an wo immer in der Anwendung auf die Anmeldeseite umgeleitet wird.

Verwandte Themen