Microservices - Kompensieren Sie Servicefehler mit der Warteschlange

8

Wir verwenden in unserer App eine Art Microservices-Ansatz (obwohl dieser nicht wirklich konsequent eingehalten wird).

Wenn ein Dienst ausfällt oder eine Ausnahme auslöst, besteht der Ansatz darin, ihn in eine Warteschlange (ActiveMQ) zu stellen und erneut zu versuchen, wenn der Dienst wieder aktiv ist.

Ist das eine "Standard" -Lösung? Oder sollte es aus irgendeinem Grund vermieden werden?

Oder gibt es eine bessere oder alternative Lösung für dieses Problem?

user140547
quelle
Was ist das Problem mit der aktuellen Lösung? Die beste / bessere Lösung ist die, die Ihren Anforderungen voll und ganz entspricht. Tun Sie das die aktuelle?
Laiv
@Laiv: Es gibt an sich kein Problem, aber da ich mit dieser Architektur nicht so erfahren bin, habe ich nur gefragt, ob es potenzielle Probleme oder Einschränkungen dieses Ansatzes gibt, die berücksichtigt werden sollten.
user140547
Was passiert, wenn die Warteschlange nicht erreichbar ist?
Jon Raynor
@ JonRaynor: Geben Sie auf und geben Sie einen Fehler zurück, da es wahrscheinlich übertrieben wäre, einen zweiten Fallback-Mechanismus zu implementieren ...
user140547

Antworten:

3

Angenommen, Sie können Ihre Anrufe asynchron machen (Sie müssen keine Antwort vom Dienst erhalten, um fortzufahren), ist dies häufig eine gute Idee.

Dadurch kann der anrufende Dienst ohne die Verzögerung (oder den direkten Fehler), die durch das Aufrufen des anderen Dienstes verursacht wird, weiterarbeiten. Dies ermöglicht Ihnen eine komplexere Wiederholungslogik und eine gleichmäßigere Verteilung der Last im Laufe der Zeit.

In vielen Fällen können Sie noch mehr daraus machen, indem Sie die Bestellgarantien der Warteschlangen aufgeben und zu Kafka oder einem anderen asynchronen Nachrichtenbroker wechseln . Hermes bietet eine bequemere REST-API zusätzlich zu Kafka.

Michał Kosmulski
quelle
Ich stimme dieser Antwort zu, vorausgesetzt, der Kontext ist, dass wir über den Kunden sprechen. Dies ist nicht wirklich eine Frage der Mikrodienste. Es ist eine Entscheidung für das Client-Design. Wenn der Dienst entweder synchron ist oder nicht und entweder aktiv ist oder nicht. Es ist in der Frage nicht klar formuliert, aber es macht wirklich nur Sinn, wenn wir über einen Kunden sprechen.
JimmyJames
3

Dies ist aus meiner Sicht ein schlechter Ansatz. du solltest es auch

  • Immer kommunizieren Eine Warteschlange anzeigen: Ihre Anwendung sollte keine sofortige Antwort erwarten und daher muss der Arbeitsprozess nicht zu 100% verfügbar sein

  • Verwenden Sie immer RPC-Kommunikation. Lastausgleichsanforderungen für mehrere Dienstinstanzen: Wenn ein Dienst fehlerhaft ist, beantwortet ein anderer die Anforderung, sodass Sie eine 100% ige Verfügbarkeit haben

Wenn Sie den Datenfluss haben, den Dienst anrufen, Fehler erhalten, in die Warteschlange stellen und die Warteschlange auf Antworten auf einige meiner Nachrichten überprüfen, jedoch nicht auf alle. ist überkompliziert.

Bearbeiten: Überkompliziert, da Sie sowohl den synchronen als auch den asynchronen Kommunikationsstil programmieren müssen und nicht nur den einen oder anderen.

Ewan
quelle
Ich stimme dem irgendwie zu. Es ist mehr kompliziert. Ob es zu kompliziert ist, ist schwer zu beurteilen, ohne die größere Architektur zu verstehen. Das Problem bei der 100% igen Warteschlangenbasis besteht darin, dass neue Single-Point-of-Failure hinzugefügt werden und einige andere Herausforderungen entstehen. Zum Beispiel , wenn der Prozess mit Aufgaben überwältigt zu werden , in die Warteschlange zu schreiben ist in der Regel sehr schnell , so gibt es kein offensichtliches Problem auf der Eingangsseite bis boom der Warteschlange füllt. Wenn die Quelle der Anforderungen nicht gedrosselt werden kann, liegt möglicherweise ein großes Problem vor. Nicht unüberwindbar, aber es fügt seine eigene Komplexität hinzu.
JimmyJames
Wenn ich darf, würde ich vorschlagen, den letzten Satz neu zu formulieren. "Erinnern" ist hier kein wirkliches Problem. Sobald der Code zum Lesen aus der Warteschlange geschrieben wurde, gibt es nichts mehr zu merken. Es ist einfach zusätzlicher Code zum Schreiben und Verwalten, aber er sollte nicht viel anders aussehen als das, was Sie hätten, wenn Sie immer aus der Warteschlange lesen würden.
JimmyJames
In den einzigen Fehlern gehen Sie in die Warteschlange und Sie möchten Antworten. Sie müssen sowohl die Warteschlangenprüfung als auch die sofortige Antwortbehandlung schreiben. Sie müssen sich also an diese fehlerhaften Anrufe erinnern und nicht an die unmittelbaren
Ewan
@ Jimmy Sie bekommen diese Probleme mit jeder Lösung. Warteschlange immer, Warteschlange manchmal oder alle RPC.
Ewan
Einige dieser Probleme haben Sie wirklich nicht, wenn Ihre Produzenten auf die Verbraucher warten. Wenn Sie beispielsweise maximal 1000 Anfragen pro Sekunde erhalten und die interne Kapazität Ihrer Prozesse auf 100 pro Sekunde sinkt, werden Ihre Produzenten auf einfache Weise blockiert. Sie werden auch begrenzt sein. Wenn Sie einfach eine Warteschlange in die Mitte einfügen, sind die Produzenten im Allgemeinen nicht vom Kapazitätsabfall betroffen und fahren mit ihrer maximalen Rate fort. Die Warteschlange füllt sich dann, bis Sie das Kapazitätslimit erreicht haben und die Schreibvorgänge fehlschlagen (bei 1000 Fehlern pro Sekunde).
JimmyJames