Google Protocol Buffers (Protobuf)
Google Protocol Buffers (Protobuf)
Google Protocol Buffers (kurz: Protobuf) sind ein binäres, plattform- und sprachunabhängiges Datenserialisierungsformat, das von Google entwickelt wurde. Protobuf wird verwendet, um strukturierte Daten effizient zwischen Systemen auszutauschen oder dauerhaft zu speichern. Es ist besonders in verteilten Systemen, Microservices und Hochleistungsanwendungen verbreitet.
Ziel und Motivation
Protocol Buffers wurden entwickelt, um:
- Daten kompakt zu serialisieren (weniger Speicherbedarf als JSON/XML)
- schnelle Verarbeitung zu ermöglichen (geringe CPU-Kosten)
- stark typisierte, versionierbare Datenstrukturen bereitzustellen
- Interoperabilität zwischen verschiedenen Programmiersprachen zu gewährleisten
Im Gegensatz zu textbasierten Formaten wie XML oder JSON ist Protobuf binär, was eine deutlich höhere Effizienz ermöglicht.
Grundprinzip
Datenstrukturen werden in einer .proto-Datei definiert, aus der Protobuf automatisch Code für verschiedene Programmiersprachen generiert. Dieser Code enthält Klassen/Strukturen, die zur Serialisierung und Deserialisierung verwendet werden.
Beispiel: .proto-Datei
syntax = "proto3";
message Person {
string name = 1;
int32 alter = 2;
repeated string interessen = 3;
}
Bedeutung:
- `message` definiert eine Datenstruktur
- Felder werden durchnummeriert, um Rückwärtskompatibilität zu gewährleisten
- `repeated` bedeutet: Liste/Array
Codegenerierung
Protobuf verwendet den Compiler `protoc`, um aus .proto-Dateien Quellcode zu erzeugen.
Beispiel (Codegenerierung für C++):
protoc --cpp_out=. person.proto
Unterstützte Sprachen u. a.:
- C++
- Java
- Python
- C#
- Go
- Rust (Community)
- JavaScript / TypeScript
Serialisierung und Deserialisierung
Die generierten Klassen bieten standardisierte Methoden:
Beispiel in Python
import person_pb2
person = person_pb2.Person()
person.name = "Alice"
person.alter = 30
person.interessen.append("Musik")
# Serialisieren
data = person.SerializeToString()
# Deserialisieren
person2 = person_pb2.Person()
person2.ParseFromString(data)
Feldnummern und Versionierung
Felder in Protobuf erhalten persistente Nummern, damit Datenstrukturen versionierbar bleiben. Neue Felder können hinzugefügt werden, ohne alte Clients zu brechen.
- Alte Clients ignorieren unbekannte Felder.
- Neue Clients können zusätzliche Informationen verarbeiten.
Dies macht Protobuf besonders geeignet für langlebige APIs.
Wire Format (Binärformat)
Protobuf kodiert Daten in einem kompakten binären Format. Typische Kodierungstechniken:
- Varint (variable Länge) zur effizienten Speicherung kleiner Zahlen
- Fixed32 / Fixed64 für feste Zahlenformate
- Length-delimited für Strings und verschachtelte Nachrichten
Protobuf vs. JSON vs. XML
| Eigenschaft | Protobuf | JSON | XML |
|---|---|---|---|
| Format | Binär | Text | Text |
| Lesbarkeit für Menschen | gering | gut | gut |
| Größe | sehr klein | mittel | groß |
| Geschwindigkeit | sehr hoch | hoch | niedrig |
| Typisierung | stark typisiert | dynamisch | flexibel, aber komplex |
| Schema-Versionierung | sehr gut | eingeschränkt | gut (XSD) |
Protobuf und gRPC
Protobuf ist das Standard-Datenformat für den RPC-Framework gRPC. Dabei können Remote Procedure Calls zwischen verteilten Services effizient abgewickelt werden.
Beispiel Service-Definition in einer `.proto`-Datei:
service PersonService {
rpc GetPerson (PersonRequest) returns (Person);
}
Vorteile
- Sehr kleines, effizientes Format
- Hohe Performance bei Serialisierung/Deserialisierung
- Starke Typisierung und gute Versionierbarkeit
- Große Sprach- und Plattformunterstützung
- Ideal für Microservices und Netzwerkkommunikation
Nachteile
- Weniger menschenlesbar als JSON oder XML
- Schema notwendig (aber stabil und versionierbar)
- Nicht ideal für Konfigurationsdateien oder Ad-hoc-Debugging
Anwendungsgebiete
- Microservices-Architekturen (insb. mit gRPC)
- Cloud-Services und Backend-APIs
- Mobile Anwendungen und IoT
- Datenspeicherung in binären Formaten
- Hochfrequenz- und Streaming-Systeme
Zusammenfassung
- Protobuf ist ein effizientes, binäres Datenformat zur Serialisierung strukturierter Daten.
- Datenstrukturen werden in `.proto`-Dateien definiert.
- Geeignet für leistungsfähige, skalierbare Systeme, insbesondere in verteilten Umgebungen.
- Häufig in Kombination mit gRPC eingesetzt.