Ich bin relativ neu in der Microservice-Architektur. Wir haben eine mittelgroße Webanwendung und ich wäge die Vor- und Nachteile der Aufteilung in Microservices ab, anstatt eines monolithischen Systems, das wir jetzt entwickeln.
Soweit ich es verstehe, betrachten Microservices A
und B
von denen jeder stützen sich auf eine Teilmenge der Daten, die der andere hat. Wenn in einer Nachricht angegeben wird A
, dass sich etwas geändert hat, B
kann diese Nachricht verwendet und eine lokale Kopie der A
Informationen repliziert werden B
.
Was passiert jedoch, wenn B
das Gerät ausfällt und nach einiger Zeit wieder hochfährt? Während dieser Ausfallzeit A
hat zwei weitere Nachrichten veröffentlicht. Woher weiß B
ich, wie meine lokale Kopie der A
Informationen aktualisiert wird ?
Zugegeben, wenn B
es sich um den einzigen Verbraucher in der A
Warteschlange handelt, kann er mit dem Lesen beginnen, sobald er wieder online ist. Was ist jedoch, wenn andere Verbraucher in der Warteschlange sind und diese Nachrichten verbraucht werden?
Genauer gesagt : Wenn bei einem Users
Dienst die E-Mail-Adresse aktualisiert wird, während ein Billing
Mikrodienst nicht verfügbar ist, wird der Billing
Mikrodienst dann erneut angezeigt. Woher weiß der Dienst, dass die E-Mail aktualisiert wurde?
Wenn microservices wieder auftauchen, wird dann eine Sendung gesendet, die sagt: "Hey, ich bin wieder auf, gib mir all deine aktuellen Informationen."
Was wären die branchenweit besten Vorgehensweisen für die Datensynchronisierung?
quelle
Orders
man etwas wissenUsers
?Antworten:
Nachdem ich ein bisschen recherchiert hatte, stieß ich auf diesen Artikel, aus dem ich einige Zitate herausgezogen habe, die meiner Meinung nach hilfreich für das sind, was ich erreichen möchte (und für zukünftige Leser). Dies bietet eine Möglichkeit, ein reaktives Programmiermodell über ein imperatives Programmiermodell zu übernehmen.
Event-Sourcing
Dies trägt dazu bei, dass, wenn ein Mikrodienst ausfällt, andere Ereignisse, die für ihn relevant sind, veröffentlicht werden und Ereignisse beispielsweise von anderen Instanzen dieses Mikrodiensts verbraucht werden, auf den dieser Mikrodienst beim erneuten Aufrufen Bezug nehmen kann
event store
, um alle abzurufen Ereignisse, die es während der Periode verpasste, in der es unterging.Apache Kafka als Event Broker
Erwägen Sie die Verwendung von Apache Kafka, das Tausende von Ereignissen pro Sekunde speichern und versenden kann und über integrierte Replikations- und Fehlertoleranzmechanismen verfügt. Es verfügt über einen permanenten Speicher mit Ereignissen, die auf unbestimmte Zeit auf der Festplatte gespeichert und zu jedem Zeitpunkt (jedoch nicht entfernt) aus dem Topic (Kafkas ausgefallene Warteschlange), an den sie übermittelt wurden, konsumiert werden können.
Wenn sich Verbraucher bei Kafka identifizieren, zeichnet Kafka auf, welche Nachrichten an welchen Verbraucher übermittelt wurden, damit er sie nicht erneut bereitstellt.
Sagas
Dies ist, wenn die Saga ins Spiel kommt. Eine Saga ist eine Folge lokaler Transaktionen. Jede lokale Transaktion aktualisiert die Datenbank und veröffentlicht eine Nachricht oder ein Ereignis, um die nächste lokale Transaktion in der Saga auszulösen. Wenn eine lokale Transaktion fehlschlägt, weil sie gegen eine Geschäftsregel verstößt, führt die Saga eine Reihe von Ausgleichstransaktionen aus, die die durch die vorhergehenden lokalen Transaktionen vorgenommenen Änderungen rückgängig machen. Lesen Sie dies für weitere Informationen.
quelle
Ich würde Ihre Idee, "die Daten an alle anderen Microservices zu senden", in Frage stellen.
Wenn ein Abrechnungsdienst eine E-Mail-Adresse benötigt, fragt er normalerweise nur den Adressdienst nach der E-Mail-Adresse des jeweiligen Kunden. Es muss keine Kopie aller Adressdaten enthalten und wird auch nicht informiert, wenn sich etwas ändert. Es fragt nur und erhält die Antwort von den neuesten Daten.
quelle
Sie können eine normale Ereigniswarteschlange durch ein Herausgeber- / Abonnentenmodell ersetzen, bei dem der
A
Dienst eine neue Nachricht mit dem Thema T veröffentlicht und derB
Typ der Microservices dasselbe Thema abonniert.Im Idealfall handelt
B
es sich um einen zustandslosen Dienst, der einen getrennten Persistenzdienst verwendet, sodass eine ausgefalleneB
Dienstinstanz ersetzt wird, indem eine oder mehrereB
Dienstinstanzen erstellt werden, um ihre Arbeit fortzusetzen und aus demselben gemeinsam genutzten Persistenzdienst zu lesen.quelle