Best Practice für den Umgang mit asynchroner Interkommunikation?

10

Kürzlich wurde ein Projekt zur Abwicklung der Kreditkartenabwicklung abgeschlossen. Eine der Schwierigkeiten, mit denen ich konfrontiert war, war die Behandlung der Verzögerung / des möglichen Ausfalls von Benachrichtigungsnachrichten. Das komplexeste Beispiel war:

  • ein externes System, das die Zahlungsaufforderung sendet
  • Mein System wandelt diese Anfrage in eine Anfrage an das Zahlungsgateway um
  • Senden des Benutzers an das Gateway
  • Warten auf die Zahlung durch den Benutzer
  • Der Benutzer kehrt zu meinem System zurück, wird jedoch gehalten, bis das System eine Benachrichtigung über Erfolg / Misserfolg erhält
  • Senden des Benutzers je nach Fehler an das externe System zurück

Noch schwieriger war die Tatsache, dass das Gateway bei fehlgeschlagenem Senden der Benachrichtigung mehrere Stunden lang versucht, die Benachrichtigung alle 15 Minuten zu senden.

Ich habe es mithilfe eines Datenbankdatensatzes ausstehender Transaktionen gelöst und dann Erfolg und Misserfolg anhand der Rückgabe sowie eines zeitgesteuerten Verzögerungslisteners für die Benachrichtigung und Transaktionsabwicklung festgestellt ...

Ziemlich schwierig!

Aber das muss schon millionenfach gelöst worden sein. Was ist also die beste Vorgehensweise?

Ich kann sehen, dass meine Zukunft darin besteht, die Handhabung zwischen all diesen Systemen zu schreiben und die Zeitverzögerungen und möglichen Netzwerkfehler zu verwalten. Daher möchte ich die Best Practices befolgen.

Buch- / Artikelempfehlungen wären toll.

Danke im Voraus!

user86928
quelle

Antworten:

13

Beim Erstellen verteilter Systeme besteht der Unterschied zwischen einem "synchronen" System und einem "asynchronen" System wie folgt: Ein synchrones System hat bekannte Obergrenzen für Berechnungs- und Nachrichtenübermittlungszeiten. Also: Sie haben ein asynchrones System, in dem bestimmte Ereignisse diese bekannten Obergrenzen nicht haben. Wie gehst du damit um?

  1. Wenn diese asynchronen Prozesse probabilistische Obergrenzen haben , können Sie Zeitüberschreitungen verwenden , um Ihr System wie ein teilweise synchrones System zu verhalten . Wenn die Antwortzeit des 98. Perzentils des Zahlungsgateways 5 Sekunden beträgt, führt ein Zeitlimit von 5 Sekunden dazu, dass 98% Ihrer Anforderungen erfolgreich sind und die anderen 2% einfach fehlschlagen. Dies bedeutet, dass Sie jetzt eine bekannte Obergrenze dafür haben, wie lange dieser Prozess entweder erfolgreich sein oder fehlschlagen wird. Diese probabilistische Fehlererkennung ist ein wichtiges Werkzeug, um asynchrone Systeme in synchrone Systeme umzuwandeln.

  2. Führen Sie eine dauerhafte Aufzeichnung dieser Ereignisse, damit Sie Ihren Systemstatus bei einem Systemausfall wiederherstellen können. Wenn Ihr Zahlungsgateway-Handler diese Ereignisse im flüchtigen Speicher hält und abstürzt, sind Sie fertig.

  3. Jede komplexe Transaktion besteht im Wesentlichen aus einer Reihe von Zustandstransformationen, die auf dem Senden und Empfangen von Nachrichten (Ereignissen) innerhalb des Systems basieren. Es hört sich so an, als würden Sie dies informell anhand Ihrer "Aufzeichnung ausstehender Transaktionen" modellieren, aber ich würde vorschlagen, dass Sie weiter gehen: Erstellen Sie für jede zu verwaltende Transaktion eine formale Zustandsmaschine , die sie beschreibt, und führen Sie eine dauerhafte Aufzeichnung ihres aktuellen Zustands . Sie werden feststellen, dass diese Zustandsautomaten leicht zu verstehen und zu testen sind und Ihnen und Ihren Benutzern die dringend benötigte Übersicht über diese Prozesse bieten.

Je asynchroner Ihr System ist, desto formaler und expliziter müssen Sie sein, wenn Sie diese komplexen Zustandsumwandlungen mit Ereignissen verwalten. Zeitüberschreitungen, dauerhafte Ereignisprotokollierung und Zustandsautomaten sind hier die beste Vorgehensweise. Aus diesem Grund basiert Erlang OTP einen Großteil seines Anwendungsverhaltens beispielsweise auf dem Zustandsmaschinenmodell.

Als Referenz habe ich nichts Besseres gefunden als die Einführung in die zuverlässige und sichere verteilte Programmierung . Es bietet Ihnen eine solide algorithmische Grundlage für das Verständnis von synchronen und asynchronen Systemen nach ersten Prinzipien.

Rein Henrichs
quelle