Wechseln Sie von JSON zu Protobuf. Lohnt es sich?


23

Wir haben REST-Webservices, die XML oder JSON (WCF) bereitstellen können. Ich spiele mit der Idee, Protobufs zu implementieren. Warum?

PROS

  1. Weniger Last auf Servern.
  2. Kleinere Nachrichtengröße - weniger Verkehr.
  3. Es ist jetzt einfacher als später zu wechseln.

CONS

  1. Müssen umgesetzt werden
  2. Es wird schwieriger sein, Nachrichten für das Debuggen zu finden.
  3. Ich kann GZip auf dem Server aktivieren und JSON wird so viel Verkehr verbrauchen

Was ist Ihr Vorschlag und / oder Ihre Erfahrung dazu?


1
Ich habe mir die Wikipedia-Seite angesehen und tatsächlich mehr Zeichen pro Schlüssel-Wert-Paar. Warum sollte es also kleinere Nachrichten geben?
Ramzi Kahil

Wegen der Serialisierung. Binärdaten werden als Binärdaten (z. B. Byte-Arrays) übertragen. Außerdem werden keine Eigenschaftsnamen in einer Nachricht angezeigt. Sie halten sich an die Hausordnung. developers.google.com/protocol-buffers/docs/encoding#structure
katit

10
Technisch haben Sie Ihre eigene Frage beantwortet, den JSON komprimiert und fertig. Am wichtigsten ist, dass Sie niemals einen tatsächlichen Geschäftsfall nennen , in dem Sie Geld und Zeit für diese Aktivität aufwenden.

Antworten:


39

Übersteigt der geschäftliche Wert der Implementierung die Kosten?

Wenn Sie implementieren, müssen Sie nicht nur Ihren Server, sondern alle Clients ändern (obwohl Sie beide Formate unterstützen und Clients nur nach Bedarf ändern können). Das wird Zeit und Prüfung erfordern, was direkte Kosten sind. Und unterschätzen Sie nicht die Zeit, die erforderlich ist, um Protokollpuffer wirklich zu verstehen (insbesondere die Gründe, warum ein Feld erforderlich oder optional ist), und die Zeit, die erforderlich ist, um den Protobuf-Compiler in Ihren Erstellungsprozess zu integrieren.

Übersteigt der Wert diesen Wert? Stehen Sie vor der Wahl "Unsere Bandbreitenkosten machen X% unserer Einnahmen aus und wir können das nicht unterstützen"? Oder sogar "wir müssen 20.000 US-Dollar ausgeben, um Server zur Unterstützung von JSON hinzuzufügen"?

Sofern Sie kein dringendes Geschäftsbedürfnis haben, sind Ihre "Profis" keine wirklichen Profis, sondern nur eine vorzeitige Optimierung.


23

ich pflege apis und jemand vor mir fügte protobuf hinzu (weil es "schneller" war). Das einzige, was schneller ist, ist RTT aufgrund der geringeren Nutzlast, und das kann mit gzipped JSON behoben werden.

Der Teil, der mir unangenehm ist, ist die relative Arbeit, um protobuf (im Vergleich zu JSON) aufrechtzuerhalten. Ich verwende Java, also verwenden wir die Jackson-Objektzuordnung für JSON. Hinzufügen zu einer Antwort bedeutet Hinzufügen eines Felds zu einem POJO. Aber für protobuf muss ich die .proto-Datei ändern und dann die Serialisierungs- und Deserialisierungslogik aktualisieren, die die Daten in / aus den Protokollpuffern und in POJOs verschiebt. Es ist mehr als einmal vorgekommen, dass jemand ein Feld hinzugefügt und vergessen hat, den Serialisierungs- oder Deserialisierungscode für die Protokollpuffer einzugeben.

Nachdem Clients die Protokollpuffer implementiert haben, ist es fast unmöglich, sich davon zu lösen.

Sie können wahrscheinlich davon ausgehen, mein Rat ist, es nicht zu tun.


5
Wenn Sie Serialisierungscode (de) schreiben, um Daten in / aus POJOs zu verschieben, machen Sie es falsch. Verwenden Sie einfach die von protobuf generierten Klassen direkt.
Marcelo Cantos

In diesem Fall habe ich POJOs verschoben, da die Codebasis sowohl JSON- als auch XML- und Protobuf-Anforderungen / -Antworten unterstützte und da ich keine Jackson- und / oder JAXB-Annotationen zu protobuf-generierten Klassen hinzufügen kann und möchte Um im gesamten Code dieselben Modellobjekte zu verwenden, weiß ich nicht, dass ich Optionen habe, um nur die generierten Klassen zu verwenden. Ich kann sehen, wie dies möglich wäre, wenn ich sagen würde, dass GRPC-Dienste nur protobuf sprechen.
Kevin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.