Unser Unternehmen führt Anwendungen auf einer Micro Service-Architektur aus, die Tausende von Diensten umfasst. Ich arbeite an einer Backend-Anwendung "X", die mit mehr als 50 Diensten kommuniziert. Frontend-Dienste rufen meinen Dienst "X" auf, um Anforderungen für andere Dienste auszuführen.
Problem :
Das Front-End möchte benutzerfreundliche Nachrichten anzeigen, wenn bei anderen Diensten ein Fehler auftritt.
- Andere Dienste geben keine benutzerfreundlichen Nachrichten zurück. Es ist mir nicht möglich, Änderungen von anderen Teams anzufordern, da es mehrere gibt.
- Es gibt keine vereinbarten Fehlercodes als solche. Andere Dienste geben eine Zeichenfolgenfehlermeldung zurück. Derzeit wird es an die Benutzeroberfläche zurückgegeben. Manchmal sind die Fehlermeldungen Zeigerreferenzen (falscher Code: /)
Mögliche Lösung :
Suchen Sie nach einer Fehlermeldung und weisen Sie meinem Dienst eine Zuordnung zu einer benutzerfreundlichen Nachricht zu. Es kann jedoch zu Problemen kommen, wenn der Angerufene-Dienst die Fehlermeldung ändert. Fallback auf eine Standardfehlermeldung, wenn keine benutzerdefinierte Fehlerzuordnung gefunden wird.
Weitere Ideen zu skalierbaren und nachhaltigen Lösungen? Vielen Dank!
quelle
Antworten:
Haftungsausschluss
Erstens machen Tausende von zufälligen Diensten eine Architektur nicht zu einer Microservices-ähnlichen Architektur. Es ist immer noch ein gewisses Gefühl für ein "Ganzes" und ein wenig Arrangement zwischen den Diensten erforderlich. Richtlinien oder Faustregeln.
Kontextualisieren Sie das Backend innerhalb des 'Ganzen'
Ich nehme an, Ihr Backend ist weder Gateway noch Proxy . Ich denke, es hat sein eigenes Geschäft und einen genau definierten begrenzten Kontext. In Bezug auf andere Dienste ist das Backend also eine Fassade .
Als Fassade gehört das Ausblenden von Implementierungsdetails (z. B. Integrationen mit Remote-Diensten) zu seinen Aufgaben. Für das Front-End (und damit für den Endbenutzer) ist der einzige vertrauenswürdige Gesprächspartner,
X
und kein Implementierungsdetail sollte die äußeren Schichten erreichen. Was auch immer unter der Haube passiert ist, es geht den Benutzer nichts an.Das heißt nicht, dass wir dem Benutzer nicht sagen können, dass etwas schief gelaufen ist. Wir können, aber wir abstrahieren diese Details. Wir werden nicht den Eindruck erwecken, dass etwas Fernes versagt. Im Gegenteil, etwas ist
X
fehlgeschlagen und das wars.Da es sich um Tausende möglicher Integrationen (+50 atm) handelt, ist die Anzahl möglicher und unterschiedlicher Fehler erheblich. Wenn wir jede einzelne einer benutzerdefinierten Nachricht zuordnen, wird der Endbenutzer von so vielen (und nicht kontextualisierten) Informationen überwältigt. Wenn wir alle Fehler einer kleinen Gruppe von benutzerdefinierten Fehlern zuordnen, verzerren wir die Informationen und machen es uns schwer, das Problem zu verfolgen und zu lösen.
Meiner Meinung nach sollten Fehlermeldungen dem Benutzer das Gefühl vermitteln, dass wir etwas tun können, um das Problem zu beheben.
Wenn Endbenutzer dennoch wissen möchten, was unter der Haube vor sich geht, gibt es andere Möglichkeiten, die für das gesamte Unternehmen nützlicher sind.
Rechenschaftspflicht
Als Entwickler liegt es in Ihrer Verantwortung, diese Argumente den Stakeholdern zugänglich zu machen. Es ist eine Frage der Rechenschaftspflicht. Meiner Meinung nach gibt es ein Leck an technischer Führung und das ist ein echtes Problem, wenn es um verteilte Systeme geht.
Es gibt keine technische Vorstellung. Wenn dies der Fall wäre, würden Dienste nach Faustregeln implementiert, um das System skalierbar zu machen und die Integration zwischen Diensten zu vereinfachen. Im Moment sieht es so aus, als würden Dienstleistungen wild erscheinen, ohne das Gefühl, zum "Ganzen" beizutragen.
Wenn ich gebeten würde, das zu tun, worum Sie gebeten wurden (und manchmal auch), würde ich darüber streiten, ob die Umwandlung der aktuellen Anarchie in benutzerfreundliche Nachrichten den Rahmen von sprengt
X
.Zumindest "erheben Sie die Hand", legen Sie Ihre Bedenken offen, legen Sie Ihre Alternativen offen und lassen Sie jeden entscheiden, der die Verantwortung hat.
Machen Sie Ihre Lösungen für das Unternehmen wertvoll
Du hast recht. Das ist eine schwache Lösung. Es ist auf lange Sicht spröde und ineffizient.
Ich denke auch, dass dies zu einer Kopplung führt, da Änderungen an diesen Zeichenfolgen Sie möglicherweise dazu zwingen, die Zuordnungen zu brechen. Keine große Verbesserung.
Berichterstattung . Behandeln Sie die Fehler, geben Sie ihnen einen Code / ein Ticket / eine ID und melden Sie sie. Lassen Sie dann das Front-End den Bericht visualisieren. Zum Beispiel teilen sich ein Link zum Reporting Service .
Auf diese Weise können Sie so viele Dienste integrieren, wie Sie benötigen. Und Sie entlasten sich vom Aufwand, zufällige Zeichenfolgen zu handhaben und in neue zufällige, aber benutzerfreundliche Zeichenfolgen zu übersetzen.
Der Berichtsdienst kann für den Rest der Dienste wiederverwendet werden, sodass Sie bei korrelierten IDs den Benutzern einen Panoramablick auf die Fehler und die Ursachen ermöglichen können. In verteilten Architekturen ist die Rückverfolgbarkeit sehr wichtig.
Später kann der Berichtsservice mit so vielen Zuordnungen erweitert werden, wie Sie benötigen, um lesbare und nützliche Anweisungen zu geben, was zu tun ist, wenn Fehler X auftritt . Ob sich die Saiten hier ändern, spielt überhaupt keine Rolle. Was wir haben (speichern), ist ein Endzustand des Berichts.
Der Berichtsdienst öffnet die Tür zu einer möglichen Normalisierung der Fehler innerhalb der Organisation, da der Dienst eine öffentliche API (daher einen Vertrag) verfügbar macht.
quelle
In Ihrem Fall gibt es kein Wunder. Die mögliche Lösung scheint die Lösung zu sein, die Sie bereits vorgeschlagen haben.
Es ist in Ordnung, wenn eine API die Fehlermeldung ändert, wenn die API auch einen Fehlercode zurückgibt, mit dem der API-Konsument den Fehler verfolgen und einer anderen Nachricht zuordnen kann (wie Sie es versuchen, aber mit der Nachricht).
Stellen Sie nur sicher, dass Sie die von der API zurückgegebene Nachricht protokollieren, bevor Sie den Fallback-Fehler ausführen. Möglicherweise können Sie die API-Nachricht in einer Art von
developerMessage
benutzerdefiniertem Fehler hinzufügen , um das Problem zu identifizieren, ohne das Protokoll zu verwenden (stellen Sie nur sicher, dass die API keine Nachricht mit sinnvollen Informationen auslöst).Wenn Sie einen Kommunikationskanal mit dem Team haben, das diese Dienste ausführt, erklären Sie Ihr Problem und bitten Sie ihn um Hilfe, da dies das gleiche Problem für das andere Team sein kann, das versucht, seine API zu verwenden.
quelle