Mein Unternehmen arbeitet derzeit an der Einführung einer Mikroservice-Architektur, aber auf dem Weg dorthin stoßen wir auf wachsende Schmerzen (Schock!). Einer der zentralen Streitpunkte, denen wir gegenüberstehen, ist die Kommunikation großer Datenmengen zwischen unseren verschiedenen Diensten.
Als Hintergrund haben wir einen Dokumentenspeicher, der als Aufbewahrungsort für alle Dokumente dient, die wir möglicherweise unternehmensweit bearbeiten müssen. Die Interaktion mit dem Geschäft erfolgt über einen Dienst, der einem Kunden eine eindeutige ID und einen Ort zum Streamen des Dokuments bereitstellt. Der Speicherort des Dokuments kann später über eine Suche mit der angegebenen ID abgerufen werden.
Das Problem ist: Ist es sinnvoll, dass alle unsere Mikrodienste diese eindeutige ID als Teil ihrer API akzeptieren, um mit Dokumenten zu interagieren, oder nicht? Für mich ist das von Natur aus falsch - die Dienste sind nicht mehr unabhängig und stützen sich auf den Dienst des Dokumentenspeichers. Zwar ist mir klar, dass dies das API-Design vereinfachen und möglicherweise sogar zu Leistungssteigerungen führen kann, doch die resultierende Kopplung wirkt den Vorteilen mehr als entgegen.
Weiß jemand, wie die Regenbogen-Einhörner (Netflix, Amazon, Google usw.) mit dem Austausch großer Dateien / Daten zwischen ihren Diensten umgehen?
quelle
Antworten:
Leider weiß ich nicht, wie sie mit solchen Problemen umgehen.
Dies verstößt gegen das Prinzip der Einzelverantwortung, das in der Architektur Ihres Mikrodienstes enthalten sein sollte. Ein Microservice - logischerweise einer, physikalisch viele Instanzen, die einen repräsentieren - sollte sich mit einem Thema befassen .
Im Fall Ihres Dokumentenspeichers haben Sie einen Punkt, an dem alle Abfragen nach Dokumenten ablaufen (natürlich können Sie diese logische Einheit für mehrere Arten von Dokumenten in mehrere Dokumentenspeicher aufteilen).
Wenn Ihre "Anwendung" ein Dokument bearbeiten muss, fragt sie den entsprechenden Microservice und verarbeitet dessen Ergebnis (se).
Wenn ein anderer Dienst ein tatsächliches Dokument oder Teile davon benötigt, muss er den Dokumentendienst fragen.
Dies ist ein architektonisches Problem:
Verringern Sie die Notwendigkeit, große Datenmengen zu übertragen
Im Idealfall verfügt jeder Dienst über alle Daten und muss nicht übertragen werden, um nur Anforderungen zu erfüllen. Als Erweiterung dieser Idee - wenn Sie Daten übertragen müssen, denken Sie an Redundanz (* in positiver Weise_): Ist es sinnvoll, die Daten an vielen Stellen redundant zu haben (wo sie benötigt werden)? Überlegen Sie, wie mögliche Inkonsistenzen Ihren Prozessen schaden können. Es gibt keine schnellere Übertragung als tatsächlich keine .
Verringern Sie die Größe der Daten
Überlegen Sie, wie Sie Ihre Daten komprimieren können: Angefangen bei den eigentlichen Komprimierungsalgorithmen bis hin zu intelligenten Datenstrukturen . Je weniger über den Draht geht, desto schneller bist du.
quelle
Wenn die ID von Ihrem Dokument speichert zurückgegeben die Art und Weise zu Referenzdokumenten über das gesamte System, dann macht es Sinn , für alle Dienste, den ‚Dokument - ID‘ auf ihren API zu akzeptieren , wenn die Service - Bedürfnisse wissen , welche dokumentieren es mit zur Arbeit muss.
Dies führt nicht unbedingt zu einer engeren Kopplung zwischen den Diensten als erforderlich. Dienste, die auf Dokumente zugreifen müssen, müssen ohnehin auf den Dokumentenspeicherdienst zugreifen und diese ID benötigen, um dem Speicher mitzuteilen, auf welches Dokument zugegriffen werden soll.
Dienste, die nicht direkt auf Dokumente zugreifen, müssen möglicherweise die Dokument-ID weitergeben. Bei diesen Diensten handelt es sich jedoch nur um eine beliebige Zeichenfolge, die keine Abhängigkeit erstellt.
quelle
Persönlich würde ich lieber keinen separaten Dokumentenspeicherdienst und eine separate Dokument-ID verwenden, sondern eine URL, um auf die Dokumente zuzugreifen (mit der richtigen Header-Authentifizierung). Bei diesem Ansatz sind keine weiteren Dienste erforderlich, um sich auf den Dokumentendienst zu verlassen, sondern es kann lediglich die vollständige URL für den Zugriff auf das Dokument verwendet werden. Auch im Hinblick auf die Skalierung ist es sinnvoll, mehrere Dokumentenspeicher als und zu verwenden Wenn der Speicher wächst, geben Sie die URL an.
Möglicherweise benötigen Sie jedoch einen oder mehrere Dienste, um ein Dokument hochzuladen und dessen URL abzurufen.
quelle
Bei der Prüfung von Amazon S3 REST API-Spezifikationen wird anscheinend das gesamte Objekt in Byte zurückgegeben. Scheint nicht viele Optionen, wenn Sie einen Microservice entwerfen. Link zum Amazon S3-Antwortformat
quelle