Kompakte Video-Metadaten mit Protobuf
Unser Ingest-Worker ruft alle zwei Stunden Tausende von Trend-Videos ab. Wir senden diese Daten an drei Dienste: einen Ranking-Service, einen Cache-Warmer und einen Analytics-Job.
Lange Zeit haben wir JSON verwendet, um diese Daten zu übertragen. Es funktionierte so lange, bis es scheiterte.
Ein einzelner Video-Datensatz war in JSON 2,4 KB groß. Das Übertragen von 40.000 Datensätzen an drei verschiedene Dienste bedeutete, alle zwei Stunden 280 MB redundanter Text zu übertragen. Dies verschwendete Bandbreite und verlangsamte unsere PHP-Worker.
Wir sind auf Protocol Buffers (Protobuf) umgestiegen. Hier ist der Grund und wie es unser System verändert hat.
Die drei Hauptprobleme mit JSON:
- Größe: JSON wiederholt Feldnamen in jedem Datensatz. Ein Feldname wie „viral_score_24h“ verbraucht allein 15 Bytes, um eine 8-Byte-Zahl zu übertragen.
- Parsing-Kosten: PHP muss den gesamten JSON-Blob parsen, selbst wenn ein Dienst nur zwei Felder benötigt.
- Schema Drift: JSON hat keinen Vertrag (Contract). Wenn ein Dienst ein Feld ändert, brechen andere Dienste stillschweigend zur Laufzeit.
Wie Protobuf dies gelöst hat:
Protobuf verwendet Feldnummern anstelle von Namen. Es nutzt eine .proto-Datei als Single Source of Truth. Diese Datei generiert Code für PHP, Python und Go. Wenn Sie das Schema ändern, schlägt die Kompilierung fehl. Dies verwandelt Laufzeitfehler in Kompilierfehler.
Die Ergebnisse:
Wir haben diese Änderungen über eine Woche lang gemessen:
- Payload-Größe: Sank von 2,4 KB auf 720 Bytes (70 % Reduzierung).
- PHP-Encode-Zeit: Sank von 310 ms auf 95 ms.
- Go-Decode-Zeit: Sank von 140 ms auf 38 ms.
- Bandbreite: Sank von 280 MB auf 84 MB pro Zyklus.
Wann man Protobuf verwenden sollte:
Verwenden Sie es nicht für alles. Wenn Ihre Payloads klein sind oder Menschen sie leicht lesen können sollen, bleiben Sie bei JSON. Nutzen Sie Protobuf für internen Hochvolumen-Traffic, bei dem Geschwindigkeit und strikte Verträge am wichtigsten sind.
Unsere öffentlichen APIs verwenden weiterhin JSON. Unsere internen Dienste nutzen Protobuf.