𝗠𝗲𝘁𝗮𝗱𝗮𝘁𝗮 𝗩𝗶𝗱𝗲𝗼 𝗥𝗶𝗻𝗴𝗸𝗮𝘀 𝗱𝗲𝗻𝗴𝗮𝗻 𝗣𝗿𝗼𝘁𝗼𝗯𝘂𝗳
Worker ingest kami mengambil ribuan video populer setiap dua jam. Kami mengirimkan data ini ke tiga layanan: layanan pemeringkatan, cache warmer, dan tugas analitik.
Untuk waktu yang lama, kami menggunakan JSON untuk memindahkan data ini. Semuanya berjalan lancar sampai akhirnya terjadi kegagalan.
Satu rekaman video berukuran 2,4 KB dalam JSON. Memindahkan 40.000 rekaman ke tiga layanan berbeda berarti memindahkan 280 MB teks redundan setiap dua jam. Hal ini membuang-buang bandwidth dan memperlambat worker PHP kami.
Kami beralih ke Protocol Buffers (Protobuf). Berikut adalah alasan dan bagaimana hal itu mengubah sistem kami.
Tiga Masalah Utama dengan JSON:
- Ukuran: JSON mengulang nama field di setiap rekaman. Nama field seperti "viral_score_24h" menggunakan 15 byte hanya untuk membawa angka berukuran 8 byte.
- Biaya Parsing: PHP harus melakukan parsing pada seluruh blob JSON meskipun sebuah layanan hanya membutuhkan dua field saja.
- Schema Drift: JSON tidak memiliki kontrak. Jika satu layanan mengubah sebuah field, layanan lainnya akan rusak secara diam-diam saat runtime.
Bagaimana Protobuf Mengatasinya:
Protobuf menggunakan nomor field alih-alih nama. Ia menggunakan file .proto sebagai single source of truth. File ini menghasilkan kode untuk PHP, Python, dan Go. Jika Anda mengubah skema, kode akan gagal dikompilasi. Hal ini mengubah bug runtime menjadi error saat kompilasi.
Hasilnya:
Kami mengukur perubahan ini selama satu minggu:
- Ukuran payload: Turun dari 2,4 KB menjadi 720 byte (pengurangan 70%).
- Waktu Encode PHP: Turun dari 310 ms menjadi 95 ms.
- Waktu Decode Go: Turun dari 140 ms menjadi 38 ms.
- Bandwidth: Turun dari 280 MB menjadi 84 MB per siklus.
Kapan harus menggunakan Protobuf:
Jangan gunakan untuk segalanya. Jika payload Anda kecil atau Anda ingin manusia dapat membacanya dengan mudah, tetaplah gunakan JSON. Gunakan Protobuf untuk lalu lintas internal bervolume tinggi di mana kecepatan dan kontrak yang ketat adalah yang terpenting.
API publik kami masih menggunakan JSON. Layanan internal kami menggunakan Protobuf.