38 Punkte von GN⁺ 2025-12-05 | Noch keine Kommentare. | Auf WhatsApp teilen
  • JSON, das sich als Standard für Web-APIs etabliert hat, ist leicht lesbar und flexibel, hat aber Grenzen bei Leistung und Stabilität
  • Protobuf (Protocol Buffers) sorgt mit strikter Typdefinition und automatischer Codegenerierung für klar abgesicherte Datenstrukturen
  • Durch binäre Serialisierung werden im Vergleich zu JSON die Datengröße um mehr als das Dreifache reduziert und die Übertragungsgeschwindigkeit verbessert
  • Da Server und Client dasselbe .proto-Schema teilen, sind Typabweichungen oder manuelle Validierung nicht nötig
  • Debugging ist schwieriger, doch in Bezug auf Leistung, Wartbarkeit und Entwicklungseffizienz ist Protobuf für moderne APIs besser geeignet

Die Verbreitung und Grenzen von JSON

  • JSON ist ein für Menschen gut lesbares Textformat, bei dem sich Daten schon mit einfachem console.log() prüfen lassen
  • Dank der nahtlosen Integration ins Web wird es in JavaScript und in Backend-Frameworks allgemein breit eingesetzt
  • Es bietet Flexibilität, weil Felder frei hinzugefügt, entfernt oder im Typ geändert werden können, was allerdings auch zu Strukturabweichungen oder Fehlern führen kann
  • Das Tooling-Ökosystem ist reichhaltig, sodass sich JSON schon mit einem Texteditor oder curl leicht handhaben lässt
  • Trotz dieser Vorteile gibt es bei Performance und Typsicherheit bessere Alternativen

Überblick über Protobuf

  • Ein binäres Serialisierungsformat, das Google 2001 entwickelt und 2008 veröffentlicht hat
  • Wird breit in internen Systemen und für die Kommunikation zwischen Microservices verwendet
  • Oft besteht das Missverständnis, dass es nur zusammen mit gRPC nutzbar ist, dabei kann Protobuf auch eigenständig in HTTP-APIs eingesetzt werden
  • Anfangs war der Zugang wegen der fehlenden Sichtbarkeit des Binärformats schwieriger, dafür liegen seine Stärken klar bei Effizienz und Stabilität

Starkes Typsystem und Codegenerierung

  • Protobuf definiert über .proto-Dateien Datenstrukturen eindeutig
    • Jedes Feld hat einen strikten Typ, eine numerische Kennung und einen festen Namen
  • Beispiel:
    message User {
      int32 id = 1;
      string name = 2;
      string email = 3;
      bool isActive = 4;
    }
    
  • Der Befehl protoc unterstützt die automatische Codegenerierung für viele Sprachen wie Dart, TypeScript, Kotlin, Swift, C#, Go und Rust
  • Mit dem generierten Code werden Serialisierung (writeToBuffer) und Deserialisierung (fromBuffer) ausgeführt, ohne manuelle Validierung oder Parsing
  • Das spart letztlich Zeit und verbessert zugleich die Wartbarkeit

Effizienz binärer Serialisierung

  • Protobuf serialisiert nicht als Text, sondern als Binärdaten und ist dadurch sehr kompakt und schnell
  • Größenvergleich derselben Daten (User-Objekt):
    • JSON: 86 Byte (68 Byte ohne Leerzeichen)
    • Protobuf: 30 Byte
  • Gründe für die Effizienz:
    • Varint-Encoding für Zahlen
    • numerische Tags statt Textschlüsseln
    • keine Leerzeichen und keine unnötige Syntax
    • Optimierung optionaler Felder
  • Das führt zu geringerem Bandbreitenverbrauch, schnelleren Antwortzeiten, weniger mobilem Datenverbrauch und einer besseren User Experience

Beispiel einer Protobuf-API auf Basis von Dart

  • Mit dem Paket shelf lässt sich ein einfacher HTTP-Server aufsetzen, der ein User-Objekt als Protobuf zurückgibt
  • Wichtige Punkte im Server-Code:
    • Ein User()-Objekt erzeugen und mit writeToBuffer() serialisieren
    • Im Response-Header 'content-type': 'application/protobuf' setzen
  • Der Client verwendet das Paket http und user.pb.dart, um Protobuf-Daten direkt zu dekodieren
  • Da Server und Client dasselbe .proto-Schema teilen, entstehen keine Abweichungen in der Datenstruktur
  • Dasselbe Vorgehen lässt sich genauso in Go, Rust, Kotlin, Swift, C#, TypeScript usw. anwenden

Verbleibende Vorteile von JSON

  • Bei Protobuf ist es ohne Schema schwer, die Bedeutung zu verstehen
    • Statt Feldnamen werden nur numerische Kennungen angezeigt, was für Menschen schwer lesbar ist
  • Beispielvergleich:
    • JSON: { "id": 42, "name": "Alice" }
    • Protobuf: 1: 42, 2: "Alice"
  • Deshalb braucht Protobuf:
    • spezielle Decoding-Tools
    • Schema- und Versionsmanagement
  • Trotzdem sind die Vorteile bei Leistung und Effizienz deutlich größer

Fazit

  • Protobuf ist eine ausgereifte und leistungsstarke Serialisierungstechnologie, die auch in öffentlichen APIs gut einsetzbar ist
  • Funktioniert auch ohne gRPC eigenständig in einer gewöhnlichen HTTP-API
  • Ein Werkzeug, das Leistung, Robustheit, Fehlerreduktion und Entwicklungseffizienz zugleich verbessert
  • Für Projekte der nächsten Generation lohnt sich die Einführung von Protobuf auf jeden Fall

Noch keine Kommentare.

Noch keine Kommentare.