Große Datei- / Datenübertragung in einer Microservice-Architektur

22

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?

PremiumTier
quelle
Was verwenden Sie für einen hochverfügbaren Dokumenten- / Dateispeicher?
Terence Johnson
@TerenceJohnson Derzeit verwenden wir eine Lösung aus eigenem Anbau. Wir migrieren zu einer Lösung, die eine RESTful-API nutzt, die nur eine eindeutige Dokument-ID und ihren Speicherort beibehält (die dem Client und nicht einem Stream zur Verfügung gestellt wird, um unnötige interne Netzwerkbelastung zu vermeiden). Die eigentliche Persistenz erfolgt über AWS.
PremiumTier,

Antworten:

7

Weiß jemand, wie die Regenbogen-Einhörner (Netflix, Amazon, Google usw.) mit dem Austausch großer Dateien / Daten zwischen ihren Diensten umgehen?

Leider weiß ich nicht, wie sie mit solchen Problemen umgehen.

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?

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.

Einer der zentralen Streitpunkte, denen wir gegenüberstehen, ist die Kommunikation großer Datenmengen zwischen unseren verschiedenen Diensten.

Dies ist ein architektonisches Problem:

  1. 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 .

  2. 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.

Thomas Junk
quelle
2

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.

Bart van Ingen Schenau
quelle
Danke für Ihre Antwort. Ich möchte hinzufügen, dass wir möglicherweise davon profitieren könnten, wenn wir unsere Mikrodienste externen Verbrauchern aussetzen, die möglicherweise nicht auch unseren internen Dokumentenspeicher nutzen möchten. Glauben Sie in diesem Sinne immer noch, dass dies der beste Ansatz ist?
PremiumTier
@PremiumTier: Ja. Diese externen Kunden müssten jedoch ein eigenes Geschäft bereitstellen, das die gleiche API wie Ihr internes Geschäft unterstützt, damit Ihre Dienste damit zusammenarbeiten können.
Bart van Ingen Schenau
Dies ist zwar sinnvoll, aber dennoch umständlicher, als wenn Dienste Streams, Byte-Arrays oder Json-Blobs anstelle von Dokumentreferenzen akzeptieren. In diesem Fall kann ein Adapterdienst einfach zuerst aufgerufen werden, um den Dateistream bei Bedarf abzurufen, bevor nachfolgende Dienste aufgerufen werden. Ich versuche übrigens nicht, argumentativ zu sein, sondern nur, die Vorzüge dieses Ansatzes zu verstehen :)
PremiumTier
2

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.

Tieffliegender Pelikan
quelle
1

Weiß jemand, wie die Regenbogen-Einhörner (Netflix, Amazon, Google usw.) mit dem Austausch großer Dateien / Daten zwischen ihren Diensten umgehen?

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

suresh
quelle