Ich denke, es könnte hilfreich sein, hier etwas theoretischer vorzugehen. Eine der motivierenden Ideen hinter Microservices ist das Weitergeben von Nachrichten. Ein Microservice ist wie ein Schauspieler im Actor-Modell. Dies bedeutet, dass jeder Prozess seinen eigenen lokalen Status beibehält und der einzige Weg für einen Prozess, auf den Status eines anderen zuzugreifen, das Senden von Nachrichten ist (und selbst dann kann der andere Prozess auf diese Nachrichten reagieren, wie er möchte). Mit "jeder Mikrodienst hat seine eigene Datenbank" ist gemeint, dass der Status eines Prozesses (dh Mikrodienst) lokal und privat ist . Zu einem großen Teil, legt dies nahe , dass die „Datenbank“ sollte kollokiertmit dem Mikrodienst, dh die "Datenbank" sollte auf demselben logischen Knoten wie der Mikrodienst gespeichert und ausgeführt werden. Verschiedene "Instanzen" des Mikrodienstes sind separate Prozesse und sollten daher jeweils eine eigene "Datenbank" haben.
Eine globale Datenbank oder eine Datenbank, die von Mikrodiensten oder sogar Instanzen eines Mikrodienstes gemeinsam genutzt wird, würde aus dieser Perspektive einen gemeinsam genutzten Zustand darstellen. Die "angemessene" Möglichkeit, dies aus der Sicht von Microservices zu handhaben, besteht darin, die gemeinsam genutzte Datenbank durch einen Microservice "Datenbank" vermitteln zu lassen. Andere Mikrodienste, die Informationen zum Inhalt der Datenbank benötigen, senden Nachrichten an diesen "Datenbank-Mikrodienst". Dies beseitigt normalerweise nicht die Notwendigkeit eines lokalen Zustands (dh pro Mikrodienstinstanz "Datenbanken") für die ursprünglichen Mikrodienste! Was sich ändert, ist das, was dieser lokale Zustand darstellt. Anstatt "User Sally ist ein Administrator" zu speichern, wird "Der Datenbank-Microservice sagte," User Sally ist ein Administrator "vor fünf Minuten" gespeichert. Mit anderen Worten, über den Zustand anderer Microservices.
Dies hat den Vorteil, dass jeder Microservice in sich geschlossen ist. Dies macht einen Mikrodienst zu einer atomaren Fehlereinheit. Sie müssen sich (meistens) nicht um einen Mikroservice in einem teilweise funktionsfähigen Zustand kümmern. Natürlich wurde das Problem in das Netzwerk der Mikrodienste verlagert. Ein Mikrodienst kann möglicherweise nicht in der Lage sein, die gewünschte Funktion auszuführen, da er nicht in der Lage ist, andere Mikrodienste zu kontaktieren. Der Vorteil ist jedoch, dass der Mikrodienst in einem genau definierten Zustand ist und möglicherweise einen verschlechterten oder eingeschränkten Dienst anbieten kann, z. Der Nachteil ist, dass es sehr schwierig ist, eine konsistente Momentaufnahme des Systems als Ganzes zu erhalten, und es kann ziemlich viel (unerwünschte) Redundanz und Duplizierung geben.
Der Vorschlag ist natürlich nicht, eine Instanz von Oracle in jeden Docker-Container zu stecken. Erstens benötigt nicht jeder Mikrodienst eine "Datenbank". Einige Prozesse benötigen keinen dauerhaften Status, um ordnungsgemäß zu funktionieren. Beispielsweise benötigt ein Mikrodienst, der zwischen zwei Protokollen übersetzt, keinen dauerhaften Status. Wenn ein persistenter Zustand benötigt wird, ist das Wort "Datenbank" nur ein Wort für "persistenter Zustand". Es kann eine Datei mit JSON drin sein oder eine SQLite - Datenbank oder eine lokal laufende Kopie von Oracle , wenn Sie wollen , oder irgendwelche anderen Mittel lokalDaten dauerhaft speichern. Wenn die "Datenbank" nicht lokal ist, sollte sie aus Sicht von Microservices wie ein separater (Mikro-) Service behandelt werden. Zu diesem Zweck ist es niemals sinnvoll, eine RDS-Instanz als "Datenbank" für einen Mikrodienst zu definieren. Auch hier ist die Perspektive nicht "ein Bündel von Mikrodiensten mit eigenen RDS-Datenbanken", sondern "ein Bündel von Mikrodiensten, die mit RDS-Datenbanken kommunizieren ". Zu diesem Zeitpunkt spielt es keine Rolle, ob die Daten in derselben Datenbankinstanz gespeichert sind oder nicht.
Pragmatisch gesehen erhöht eine Microservices-Architektur die Komplexität enorm . Diese Komplexität ist nur der Preis für eine ernsthafte Behandlung von Teilfehlern. Für viele ist es ein Overkill, der die Vorteile möglicherweise nicht wert ist. Sie sollten sich frei fühlen, Ihr System so zu entwerfen, wie es Ihnen am vorteilhaftesten erscheint. Es besteht die gute Möglichkeit, dass Bedenken hinsichtlich Einfachheit und Effizienz zu Abweichungen von einer reinen Microservices-Architektur führen können. Die Kosten werden durch zusätzliche Kopplung verursacht, die ihre eigene Komplexität mit sich bringt, z. B. unsichtbare Wechselwirkungen zwischen Diensten und Einschränkungen Ihrer Freiheit bei der Bereitstellung und Skalierung nach Ihren Wünschen.