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