𝗞𝗼𝗺𝗽𝗮𝗸𝘁𝗼𝘄𝗲 𝗠𝗲𝘁𝗮𝗱𝗮𝗻𝗲 𝗪𝗶𝗱𝗲𝗼 𝘇 𝗣𝗿𝗼𝘁𝗼𝗯𝘂𝗳

Nasz worker ingestujący pobiera tysiące trendujących filmów co dwie godziny. Przesyłamy te dane do trzech usług: usługi rankingowej, cache warmera oraz zadania analitycznego.

Przez długi czas używaliśmy JSON do przesyłania tych danych. Działało to, dopóki nie zawiodło.

Pojedynczy rekord wideo w formacie JSON zajmował 2,4 KB. Przesyłanie 40 000 rekordów do trzech różnych usług oznaczało przesyłanie 280 MB zbędnego tekstu co dwie godziny. Marnowało to przepustowość i spowalniało nasze workery PHP.

Przeszliśmy na Protocol Buffers (Protobuf). Oto dlaczego i jak zmieniło to nasz system.

Trzy główne problemy z JSON:

Jak Protobuf rozwiązał ten problem:

Protobuf używa numerów pól zamiast nazw. Wykorzystuje plik .proto jako pojedyncze źródło prawdy (single source of truth). Plik ten generuje kod dla PHP, Pythona i Go. Jeśli zmienisz schemat, kod nie skompiluje się. Dzięki temu błędy czasu wykonywania (runtime) zamieniają się w błędy kompilacji.

Wyniki:

Mierzyliśmy te zmiany przez tydzień:

Kiedy używać Protobuf:

Nie używaj go do wszystkiego. Jeśli Twoje payloade są małe lub potrzebujesz, aby były łatwe do odczytu przez ludzi, pozostań przy JSON. Używaj Protobuf dla dużego natężenia ruchu wewnętrznego, gdzie liczy się przede wszystkim szybkość i ścisłe kontrakty.

Nasze publiczne API wciąż używają JSON. Nasze wewnętrzne usługi używają Protobuf.

Źródło: https://dev.to/ahmet_gedik778845/compact-video-metadata-serialization-with-protobuf-across-php-services-19lk