Ich habe über Microservices gelesen und es erscheint mir unlogisch, eine separate Datenbank pro Service zu erstellen, um eine Isolation zu erreichen. Ich kann dasselbe nur mit Webdiensten und einer einzigen Datenbank erreichen. Warum brauchen wir es überhaupt? Die Sache, dass separate Datenbank ist nicht zu diskutieren. Oder irre ich mich einfach? Kannst du mich dazu führen?
architecture
database
web-services
microservices
services
Fragen stellen
quelle
quelle
Antworten:
Das tust du nicht.
Das Erstellen einer separaten Datenbank für jeden Dienst hilft beim Durchsetzen von Domänengrenzen, es ist jedoch nur ein Ansatz. Nichts hindert Sie daran, dass alle Ihre Dienste dieselbe Datenbank verwenden.
Solange sich Ihre Dienste verhalten und keine unerwarteten Dinge mit Daten anderer Dienste tun, ist alles in Ordnung.
Ich weiß nicht, was Sie lesen, aber Sie sollten sich bewusst sein, dass es viele unterschiedliche Meinungen zur Microservices-Architektur gibt. Hier ist ein guter Blog-Beitrag zum Thema.
quelle
Wie Dan Wilson antwortet, brauchen Sie es nicht wirklich. Microservices sind das neue heiße Ding, und wie alle neuen heißen Dinge nutzen die Leute sie an vielen Orten, auch wenn sie nicht viel Wert bieten.
Mit Microservices können Sie Dinge unabhängig voneinander auf "Mikro" -Ebene bereitstellen und skalieren. Diese Granularität bietet eine Reihe technischer Vorteile und noch mehr nichttechnische Vorteile, da Sie Entwicklungsteams besser trennen, nach Bedarf anstatt einer großen Version veröffentlichen, neue Technologien oder Prozesse isoliert ausprobieren usw. Wenn eine gemeinsame Datenbank zerstört wird viel davon wegen der Abhängigkeit von der DB. Wenn Sie Ihren Dienst nicht bereitstellen können, ohne sich um die Daten anderer Dienste zu kümmern, haben Sie verloren.
Das heißt, Sie sind auch einfach falsch.
Wenn Sie in der Cloud arbeiten, sind Datenbanken billig. Normalerweise kostenlos! Sicher, der Server kostet Geld, aber wir sprechen nicht über einen einzelnen Server pro Microservice (zumindest zunächst nicht). Ein einzelner Server mit einer Reihe von (logischen) Datenbanken ist in Ordnung, solange Sie fleißig datenbankübergreifende Abfragen vermeiden (die Abhängigkeiten einführen, die "unabhängig bereitstellbar und skalierbar" schädigen). Zur Hölle, DB-übergreifende Abfragen sind in einigen Cloud-Datenbankdiensten wie Azure SQL nicht möglich. Sie müssen dort nicht einmal fleißig sein ...
Und ich habe sogar Microservices gesehen, bei denen sie eine Datenbank gemeinsam genutzt haben, aber jeder Dienst hat sein eigenes Schema. Auch hier müssen Sie sorgfältig Abfragen vermeiden, die Datengrenzen überschreiten.
Viele Orte sind nicht so fleißig. Sie haben Entwickler der Einstiegsklasse oder Leute, die den Microservice-Ansatz nicht schätzen oder schlechte Teamleiter haben oder Zeitdruck haben, der dazu führt, dass Leute Abkürzungen nehmen.
Eine separate Datenbank ist der sauberste Weg, um diese Entkopplung zu erzwingen, die Dienstunabhängigkeit ermöglicht, aber nicht der einzige Weg. Und es ist nicht so teuer - besonders wenn man es mit der Zeit / dem Gehalt vergleicht, die für den Versuch aufgewendet wurde, Datengrenzen in einer gemeinsam genutzten Datenbank durchzusetzen.
quelle
Der enorme Vorteil von Microservices - und vor allem von SOA - ist der hohe Abstraktionsgrad der Interna - nicht nur die Implementierung, sondern auch die verwendeten Technologien. Wenn beispielsweise ein System in Form von fünf Microservices von fünf Teams entwickelt wird, kann ein Team entscheiden, auf einen völlig anderen technologischen Stack (z. B. von Microsoft Stack zu LAMP) zu wechseln, ohne andere Teams nach ihrer Meinung zu fragen.
Schauen Sie sich Amazon AWS oder Twilio an. Wissen Sie, ob ihre Dienste in Java oder Ruby implementiert sind? Verwenden sie Oracle oder PostgreSQL oder Cassandra oder MongoDB? Wie viele Maschinen benutzen sie? Interessiert dich das überhaupt? Mit anderen Worten, wirken sich diese technologischen Entscheidungen auf die Art und Weise aus, wie Sie diese Dienste nutzen? ... Und was noch wichtiger ist: Wenn sie in eine andere Datenbank verschoben werden, müssten Sie Ihre Clientanwendung entsprechend ändern?
Was passiert nun, wenn zwei Dienste dieselbe Datenbank verwenden? Hier ist ein winziger Teil der Probleme, die auftreten können:
Das Team, das Service 1 entwickelt, möchte von SQL Server 2012 zu SQL Server 2016 wechseln. Team 2 stützt sich jedoch auf eine veraltete Funktion, die in SQL Server 2016 entfernt wurde.
Service 1 ist ein großer Erfolg. Das Hosten der Datenbank auf zwei Computern (Master und Failover) ist keine Option mehr. Die Skalierung des Clusters auf mehrere Computer erfordert jedoch Strategien wie Sharding. In der Zwischenzeit ist Team 2 mit der aktuellen Skala zufrieden und sieht keinen Grund, zu etwas anderem überzugehen.
Dienst 1 sollte als Standardcodierung auf UTF-8 umgestellt werden. Service 2 ist jedoch mit der Verwendung von Code Latin 125 1 zufrieden.
Dienst 1 beschließt, einen Benutzer mit einem bestimmten Namen hinzuzufügen. Dieser Benutzer existiert jedoch bereits und wurde vor einigen Monaten vom zweiten Team erstellt.
Service 1 benötigt viele verschiedene Funktionen. Service 2 ist eine äußerst wichtige Komponente und muss die Datenbankfunktionen auf ein Minimum beschränken, um das Risiko von Angriffen zu verringern.
Service 1 benötigt 15 TB Festplattenspeicher. Die Geschwindigkeit ist nicht wichtig, daher sind normale Festplatten vollkommen in Ordnung. Service 2 benötigt höchstens 50 GB, muss jedoch so schnell wie möglich darauf zugreifen, sodass die Daten auf einer SSD gespeichert werden sollten.
...
Jede kleine Wahl betrifft jeden. Jede Entscheidung muss von Menschen aus jedem Team gemeinsam getroffen werden. Kompromisse müssen gemacht werden. Vergleichen Sie dies mit der völligen Freiheit, in einem SOA-Kontext zu tun, was Sie wollen.
Dann machst du es falsch. Ich nehme an, Sie stellen manuell bereit .
So sollten die Dinge nicht gemacht werden. Sie müssen die Bereitstellung von virtuellen Maschinen (oder Docker-Containern) automatisieren, auf denen die Datenbank ausgeführt wird. Sobald Sie sie automatisiert haben, ist die Bereitstellung von zwei Servern oder zwanzig Servern oder zweitausend Servern nicht sehr unterschiedlich.
Das Magische an isolierten Datenbanken ist, dass sie extrem verwaltbar sind . Haben Sie versucht, eine riesige Datenbank zu verwalten, die von Dutzenden von Teams verwendet wird? Es ist ein Albtraum. Jedes Team hat spezifische Anforderungen, und sobald Sie etwas berühren, betrifft es jemanden. Mit einer Datenbank, die mit einer App gekoppelt ist, wird der Umfang sehr eng, was bedeutet, dass Sie viel weniger darüber nachdenken müssen.
Wenn für eine große Datenbank spezialisierte Systemadministratoren erforderlich sind, können Datenbanken, die nur von einem Team verwendet werden, im Wesentlichen von diesem Team verwaltet werden (DevOps handelt auch davon), wodurch Systemadministratoren Zeit sparen.
Kosten definieren.
Die Lizenzkosten hängen von der Datenbank ab. Im Zeitalter des Cloud Computing bin ich mir ziemlich sicher, dass alle großen Unternehmen ihre Lizenzierung neu gestaltet haben, um dem Kontext gerecht zu werden, in dem es anstelle einer großen Datenbank viele kleine gibt. Wenn nicht, können Sie in eine andere Datenbank wechseln. Es gibt übrigens viele Open Source.
Wenn Sie über Rechenleistung sprechen, sind sowohl virtuelle Maschinen als auch Container CPU-freundlich, und ich würde nicht sehr bestätigen, dass eine große Datenbank weniger CPU verbraucht als viele kleine, die denselben Job ausführen.
Wenn Ihr Problem der Speicher ist, sind virtuelle Maschinen keine gute Wahl für Sie. Container sind. Sie können so viele RAMs umfassen, wie Sie möchten, da Sie wissen, dass sie nicht mehr RAM als nötig verbrauchen. Während der Gesamtspeicherverbrauch für viele kleine Datenbanken höher ist als für eine große einzelne, nehme ich an, dass der Unterschied nicht allzu wichtig ist. YMMV.
quelle
Abhängig davon, was Sie für "teuer" halten.
Eine Datenbank muss nicht unbedingt ein teurer kommerzieller Datenbankserver sein (denken Sie an Oracle), es muss nicht unbedingt eine ressourcenhungrige Angelegenheit sein. Abhängig von Ihren Anforderungen können Sie die SQLite-Datenbank oder sogar das Dateisystem als dauerhaften Datenspeicher verwenden.
Alle diese Dienste können auch eine einzelne Datenbankinstanz / einen einzelnen Server gemeinsam nutzen und haben nur isolierte Schemas pro Dienst.
Das Hauptargument hierbei ist, dass der Dienst seine Daten besitzen und steuern muss. Wie dies erreicht wird, ist eine Frage der Wahl und der technischen Details.
Der beste Weg, wie ein Dienst seine Daten besitzen und kontrollieren kann, ist eine eigene „persönliche“ Datenbank. Dies ermöglicht eine vollständige Wahlfreiheit bei der Entwicklung der Technologie und des Datenschemas. Der einzige Weg, wie ein anderer Dienst auf Daten zugreifen kann, die einem Dienst gehören, besteht darin, die Daten von einem Dienst anzufordern. Auf diese Weise kann die interne Datendarstellung, wenn sie geändert werden muss, leicht geändert werden, und es werden keine anderen Dienste unterbrochen.
Also, um es noch einmal zusammenzufassen. Es ist nicht unbedingt teuer, eine Datenbank pro Dienst zu haben, und es ist auch nicht notwendig. Es ist einfach eine Entscheidung, die Sie irgendwann treffen müssen, wenn Sie Microservices entwickeln. Jede Auswahl hat ihre Auswirkungen und Grenzen. Studieren Sie diese und treffen Sie Ihre eigene Wahl.
quelle