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?
microservices
message-queue
user140547
quelle
quelle
Antworten:
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.
quelle
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.
quelle