/ / Was sind die praktischen Nachteile der Verwendungstark typisiertes Datenaustauschformat (z. B. Thrift / Capn Proto) in einem Microservices-Kontext? - JSON, Serialisierung, Sparsamkeit, Microservices, Datenaustausch

Was sind die praktischen Nachteile der Verwendung eines stark typisierten Datenaustauschformats (z. B. Thrift / Capn Proto) in einem Microservices-Kontext? - JSON, Serialisierung, Sparsamkeit, Microservices, Datenaustausch

Ich denke darüber nach, eine stark typisierte einzuführen(Lesen - mit vordefiniertem Schema) Datenaustauschformat für die Kommunikation zwischen unseren internen Diensten. Zum Beispiel denke ich so etwas wie Thrift oder Cap "n Proto.

Mindestens zwei offensichtliche Vorteile (für mich) bei der Verwendung gegenüber JSON sind die folgenden

  1. Sie würden das genaue Format der Daten kennen, die der Dienst erwarten kann (lässt also weniger Raum für Mehrdeutigkeiten und Fehler bei der Kommunikation) und
  2. Die Implementierung deserialisiert im Allgemeinen die Rohnachricht für Sie und bietet Methoden für den Zugriff auf die Objekte.

Was sind die praktischen Nachteile dieses Weges gegenüber JSON?

Für den Kontext - unser System besteht aus Dienstleistungengeschrieben in Python und Java - und möglicherweise in anderen Sprachen in der Zukunft - und kommuniziert über HTTP-Endpunkte zwischen Diensten und Nachrichtenbrokern wie rabbitmq.

Antworten:

0 für die Antwort № 1

Wie bei jedem stark typisierten System besteht einer der Hauptvorteile zweifellos darin, dass Sie Fehler machen, wenn Sie Fehler machen scheitert früh in der Regel in der Kompilierungsphase, was eine gute Sache ist.

Der zweitgrößte Vorteil IMHO ist, was Sie bereitssagte: Weil die Felder und Typen bekannt sind, wissen der Compiler, die Bibliotheken und der zugehörige Code, welche Daten zu erwarten sind, und können somit effizienter geschrieben / organisiert werden - oder kurz gesagt: Performance.

Im Gegensatz dazu ein lose typisiertes System (wie Avro), das viel mehr zulässt Flexibilität Ohne dass eine Neukompilierung erforderlich ist, gibt es die andere Seite derselben Medaille: die Kehrseite der Fehleranfälligkeit hinsichtlich des Inhalts der Nachricht zur Laufzeit.

Dies liegt daran, dass ein lose definiertes System definiertNur die Syntax eines gültigen Dokuments (wie z. B. XML) und die Semantik auf Nachrichtenebene der Inhalte im Dokument werden den oberen Ebenen überlassen. Ein stark typisiertes System verfügt über das Wissen über die bereits integrierte Semantik auf Nachrichtenebene zur Kompilierzeit. Daher ist es leicht zu erkennen / zu entscheiden, obEin bestimmtes Dokument oder eine bestimmte Nachricht ist nicht nur wohlgeformt, sondern auch hinsichtlich des Nachrichteninhalts gültig. Wenn Sie dasselbe mit dem lose definierten System tun müssen, müssen Sie zusätzliche Informationen bereitstellen zur Laufzeit (wie XML-Schema) und validieren Sie Ihr Dokument danach.

Endeffekt

Welches System Sie bevorzugen, ist mehr oder weniger eine FrageGeschmack in den meisten Fällen. Ich würde die Entscheidung basierend auf der Frage treffen, wie variabel die Daten sind, mit denen ich umgehen muss. Wenn es sinnvoll ist, ein stark typisiertes System zu verwenden, würde ich diesen Weg gehen, weil es mir sehr gefällt, informiert zu werden über Fehler und Irrtümer früh.

Wenn es jedoch einen Bedarf an sehr flexiblen gibtDatenstrukturen kann es sinnvoller sein, den anderen Weg zu gehen. Obwohl das Entwerfen eines lose typisierten Schemas auf einem stark typisierten System sicherlich möglich ist, ist es etwas widersprüchlich und Sie werden am Ende eine übermäßig komplizierte, wenn auch übermäßig generische Sache haben.


0 für die Antwort № 2

Eingegeben

Eingehende Nachrichten, die mit einem Typ versehen sind, sind sehrbefreiend, solange es möglich ist, die eingehende Nachricht zu erkennen, ohne sie alle zu lesen. Wenn ja, ist Ihnen die Reihenfolge der Nachrichten nicht mehr so ​​wichtig. Dies liegt daran, dass der Empfänger der Nachrichten leicht damit umgehen kann was auch immer es gesendet wird. Sie können also eine Anwendung haben, die nur dort sitzt und alles nimmt, was sie bekommt, und einfach das tut, was für jede geeignet ist.

Format

Eine Schemasprache, mit der Sie Werte definieren könnenund Größenbeschränkungen sind sehr nützlich. Dies bedeutet, dass der Absender einer Nachricht nicht versehentlich eine ungültige Nachricht senden kann. Darüber hinaus kann der Empfänger automatisch feststellen, ob eine eingehende Nachricht dem Schema entspricht. Dies ist ein echter Bonus bei der Implementierung eines Netzwerkdienstes. Der Großteil der Nachrichtenüberprüfung wird für Sie erledigt!

Mit Größenbeschränkung meine ich, dass Sie angeben könnenWie lange sich ein Array im Schema befindet und der generierte Code sich weigert, Arrays länger oder kürzer zu verarbeiten. Stellen Sie sich unter Wertebeschränkungen ein Nachrichtenfeld mit dem Namen "Peilung" vor. Möglicherweise möchten Sie den Wert auf 0 bis 359 beschränken.

Mit beiden können Sie eine klare, eindeutige machenAussage über die Schnittstelle und lassen Sie sie automatisch erzwingen. Wie viele Sicherheitslücken gab es in letzter Zeit, bei denen einige Datenüberprüfungen der Netzwerkschnittstelle schlecht implementiert wurden ...

Optionen

Ein Serialisierungsstandard, der all dies erledigt, istASN.1. Die Tools, die ich verwendet habe, verwenden ein ASN.1-Schema und erzeugen Code zum Serialisieren und Deserialisieren. Dabei wird automatisch überprüft, ob die Wert- und Größenbeschränkungen erfüllt wurden, und es wird auch angegeben, um welchen eingehenden Nachrichtentyp es sich handelt. Die Tools für ASN.1 können sein ziemlich älter und müssen aktualisiert werden. Wenn es aktualisiert wird, ist es für jeden Zweck ideal, da sowohl Binär- als auch Textdrahtformate verfügbar sind.

Es gibt jetzt auch JSON-Schemas, und sie scheinen Einschränkungen hinsichtlich Typ, Wert und Größe zu haben. Dies könnte das sein, wonach Sie suchen.

Ich bin mir ziemlich sicher, dass Google Protocol Buffers das Typ-Tagging nicht sehr gut macht und keine Wert- und Größenbeschränkungen. Ich habe Kommentare im GPB-Schema gesehen, die wie folgt aussehen:

// darf nicht größer als 10 sein.

Wenn dies in ein Schema geschrieben wird, ist die Schemasprache wohl unzureichend ...

Ich bin mir von Thrift nicht sicher, ich bin mir nicht sicher, ob es Wertbeschränkungen gibt (jemand korrigiert mich, wenn ich mich irre!).

Nachteile

Ich kann mir nichts vorstellen! Es kann Entwickler irritieren. Code, den sie für gut hielten, kann leicht als Junk-Nachricht entlarvt werden, was sie sehr nervt ...