Aufgrund einer Kombination aus Geschäfts- / Unternehmensanforderungen und den Vorlieben unseres Architekten sind wir zu einer bestimmten Architektur gekommen, die mir ein wenig abgeneigt erscheint, aber ich habe nur sehr begrenzte Architekturkenntnisse und noch weniger Cloud-Kenntnisse, daher würde ich gerne einen Sanity Check sehen Wenn hier Verbesserungen vorgenommen werden können:
Hintergrund: Wir entwickeln einen Ersatz für ein bestehendes System, das von Grund auf neu geschrieben wurde. Dies erfordert, dass wir Daten von einer SAP-Instanz über BAPI / SOAP-Webdienste beziehen und einige eigene Datenbanken für Daten verwenden, die nicht in SAP enthalten sind. Derzeit sind alle Daten, die wir verwalten werden, in lokalen DBs in einer verteilten Anwendung oder in einer MySQL-Datenbank vorhanden, aus der migriert werden muss. Wir müssen eine Handvoll Webanwendungen erstellen, die die Funktionalität der vorhandenen verteilten App replizieren und administrative Funktionen für die von uns kontrollierten Daten bereitstellen.
Geschäfts- / Unternehmensanforderungen:
Alle von uns kontrollierten Datenbanken müssen in MS SQL Server implementiert sein
Minimieren Sie die Anzahl der erstellten Datenbanken
In Phase 1 werden wir unsere Anwendungen in Azure bereitstellen, aber wir müssen in der Lage sein, diese Anwendungen in Zukunft vor Ort bereitzustellen
Unser Ops-Team möchte, dass wir alles andocken, da sie der Meinung sind, dass dies die Verwaltung des Codes erheblich vereinfacht.
Replikation von Daten minimieren / eliminieren
Der Codierungsstapel wird .NET Core für Microservices und Admin-Apps sein, Angular 5 jedoch für die Haupt-Front-End-Anwendung.
Aus diesen Anforderungen entwickelte unser Architekt diesen Entwurf:
Unsere Frontends werden von einer Reihe von Microservices gespeist (ich verwende diesen Begriff leichtfertig, da sie auf Domain-Ebene und ziemlich groß sind), die in jeder Domain in Lese- und Schreibdienste unterteilt werden. Beide sind über Kubernetes skalierbar und lastausgeglichen. Jeder hat auch eine schreibgeschützte Kopie seiner Datenbank in seinem Container angehängt, wobei eine einzelne Master-Instanz der Datenbank für Schreibvorgänge verfügbar ist, die Aktualisierungen dieser schreibgeschützten Kopien herausbringt.
(Entschuldigung für die schlechte Bildqualität, ich mache sie aus dem Speicher wieder gut, da es natürlich keine eigentliche Dokumentation für dieses Zeug gibt, außer im Kopf des Architekten.)
Die Service-to-Service-Kommunikation erfolgt über eine Nachrichtenwarteschlange, die jeder Dienst abhört und alle relevanten Nachrichten verarbeitet. Dies wird hauptsächlich für die E-Mail-Generierung verwendet, da wir noch nichts identifiziert haben, das Service-to-Service-Kommunikation für Informationen erfordert. Alles, was mit "Geschäftslogik" zu tun hat und die Beteiligung mehrerer Dienste erfordern würde, würde wahrscheinlich von den Frontends ausgehen, wo die Frontends jeden Dienst einzeln aufrufen und sich mit Atomizität befassen würden.
Aus meiner Sicht reiben mich die schreibgeschützten Datenbankinstanzen, die sich in den Docker-Containern für die Dienste drehen, in die falsche Richtung. Der Dienst selbst und die Datenbank hätten drastisch unterschiedliche Anforderungen an die Last, daher wäre es viel sinnvoller, wenn wir sie separat ausgleichen könnten. Ich glaube, MYSQL hat eine Möglichkeit, dies mit Master / Slave-Konfigurationen zu tun, bei denen neue Slaves hochgefahren werden können, wenn die Last hoch wird. Insbesondere wenn wir unser System in der Cloud haben und für jede Instanz bezahlen, erscheint es verschwenderisch, eine neue Instanz des gesamten Dienstes zu starten, wenn wir nur eine andere Datenbankinstanz benötigen (wie im Gegenteil, eine neue Datenbankkopie zu starten, wenn wir es wirklich gerade tun benötigen eine Webdienstinstanz). Ich kenne jedoch die Einschränkungen von MS SQL Server dafür nicht.
Mein größtes Anliegen ist die Implementierung von MS SQL Server. Es fühlt sich falsch an, die schreibgeschützten Instanzen so eng mit den Diensten zu koppeln. Gibt es einen besseren Weg, dies zu tun?
HINWEIS: Ich habe dies beim Software-Engineering angefragt und sie haben mich hier gezeigt. Entschuldigung, wenn dies nicht die entsprechende SE ist.
Es gibt auch kein MS SQL Server-Tag