Wenn eine Microservice-Architektur eine separate Datenbank pro Microservice benötigt, ist dies zu kostspielig und nicht verwaltbar. Warum brauchen wir es überhaupt?

10

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?

Fragen stellen
quelle
6
Datenbanken sind kostenlos
Ewan
Eines der Ziele von Microservices ist unter anderem die Skalierung über eine Monolitich-Architektur hinaus. Wenn Ihre Anwendung nicht einmal die erforderliche Skalierung aufweist, können Sie Ihre anderen Anforderungen überprüfen, um festzustellen, ob es sich lohnt, in Microservices zu investieren. Darüber hinaus hindert nichts Sie daran, Ihren gesamten oder einen Teil Ihres Mikrodienstes auf derselben physischen Maschine "anzudocken", wenn Sie nicht über das Geld verfügen, um sie aufzuteilen.
Walfrat
Dienste können eine Datenbank problemlos gemeinsam nutzen, während sie isoliert bleiben: Geben Sie jedem Dienst einfach einen eigenen Datenbankbenutzer mit Zugriff auf seine Tabellen, jedoch nicht auf die Tabellen anderer Dienste.
Stellen Sie Monica
Warum benötigen Sie mehr als ein Codemodul? Sie können einfach den gesamten Code in eine große Spaghetti-Klasse einfügen! Es ist weniger Arbeit !!! (Der Nachteil ist natürlich, dass das Änderungsmanagement zu einem großen Problem wird.)
John Wu
@ Solomonoff'sSecret, das allein reicht nicht aus, um Ihre Dienste zu isolieren. Einer dieser „Benutzer“ könnte immer noch eine Run-Away-Abfrage ausführen, die alles verlangsamt oder herunterfährt. Es ist immer noch eine einzige Fehlerquelle. Sie haben sie nur logisch isoliert.
RubberDuck

Antworten:

15

Warum brauchen wir es überhaupt?

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.

Ich habe Leute gesehen, die sich teilweise trivial auf diese Idee bezogen haben: "Jeder Mikrodienst sollte seine eigene Datenbank besitzen und steuern, und keine zwei Dienste sollten eine Datenbank gemeinsam nutzen." Die Idee ist richtig: Teilen Sie keine einzelne Datenbank für mehrere Dienste, da Sie dann auf Konflikte wie konkurrierende Lese- / Schreibmuster, Datenmodellkonflikte, Koordinationsprobleme usw. stoßen.

Eine einzige Datenbank bietet uns jedoch viele Sicherheitsvorkehrungen und Annehmlichkeiten: ACID-Transaktionen, ein einziger Ort zum Anschauen, gut verstanden (irgendwie?), Ein einziger Ort zum Verwalten usw.

Die Reise zu Microservices ist genau das: eine Reise . Es wird für jedes Unternehmen anders sein. Es gibt keine festen Regeln, nur Kompromisse.

Das Schwierigste an Microservices: Ihre Daten

Dan Wilson
quelle
2
In einigen Umgebungen ist Ihr Speicher ohnehin nur ein weiterer
Mikrodienst
2
Du brauchst es tatsächlich. Ein Hauptvorteil von Microservices besteht darin, dass alles vollständig isoliert werden kann. Ein Team kann eines Tages entscheiden, von einem vollständigen Microsoft-Stack zu LAMP zu wechseln, ohne andere Teams um Rat zu fragen. Wenn dieselbe Datenbank gemeinsam genutzt wird, sind Sie nicht mehr frei. Team A möchte von SQL Server 2012 zu SQL Server 2016 wechseln, Team B jedoch nicht, da eine Funktion verwendet wird, die aus der neueren Version entfernt wurde. Leider ist dies nicht auf Versionen beschränkt. Alles, was zwei Teams gemeinsam haben, kann zu einem Konflikt führen.
Arseni Mourzenko
@ArseniMourzenko Ich verstehe, dass Microservices plattformunabhängig und nur durch Serviceverträge gekoppelt sein sollten, aber es ist nicht unmöglich, eine von mehreren Services gemeinsam genutzte Datenbank aufzuteilen, wenn Sie einen soliden Migrationsplan haben. In meiner vorherigen Rolle war ich derjenige, der für separate Datenbanken für unsere mandantenfähige Gesundheitsanwendung plädierte, aber das Management entschied sich aus Kostengründen für ein gemeinsames Modell. Das frustriert mich über ein Jahr später immer noch.
Dan Wilson
Ich habe auch keine Organisation gesehen, die es Teams tatsächlich erlaubt hat, sehr unterschiedliche Plattformen zu verwenden (z. B. .NET vs LAMP). Eine solche Schurkenentscheidung würde ziemlich schnell abgeschossen werden, weil befürchtet wird, dass bestimmte Dienste in Silos landen und nur von einem Team aufrechterhalten werden könnten.
Dan Wilson
@DanWilson: Es ist natürlich möglich, eine Datenbank später zu teilen. Das Problem ist, dass das Aufteilen zu einer schwierigen Wahl wird, wenn Sie mit einer gemeinsam genutzten Datenbank beginnen. Grundlegendes Beispiel: Sie möchten eine Funktion aus der nächsten Version der Datenbank. Das andere Team kann noch nicht migrieren. In den meisten Fällen werden Sie nicht teilen (zu schwierig), aber es vorziehen, die neue Funktion nicht zu verwenden, was unglücklich ist.
Arseni Mourzenko
4

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.

Die Sache, dass separate Datenbank ist nicht zu diskutieren. Oder irre ich mich einfach?

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.

Telastyn
quelle
großartig. Ich denke, wenn wir nicht die Größe von Amazon oder Uber haben, sollten wir es einfach vermeiden.
Posting Fragen
1
@PostingQuestions - warum denkst du das?
Telastyn
Wir machen Projekte, haben aber nicht das Gefühl, dass wir sie brauchen.
Posting Fragen
1

Warum brauchen wir es überhaupt?

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.

es ist zu [...] unüberschaubar.

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.

es ist zu teuer

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.

Arseni Mourzenko
quelle
0

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.

Roland Tepp
quelle