- JSON, yang telah menjadi standar untuk web API, mudah dibaca dan fleksibel, tetapi memiliki keterbatasan dalam hal performa dan stabilitas
- Protobuf (Protocol Buffers) menjamin struktur data secara jelas melalui definisi tipe yang ketat dan pembuatan kode otomatis
- Dengan menggunakan serialisasi biner, Protobuf dapat mengurangi ukuran data lebih dari sekitar 3x dan meningkatkan kecepatan transmisi dibanding JSON
- Server dan klien berbagi skema
.proto yang sama sehingga tidak ada ketidakcocokan tipe atau kebutuhan validasi manual
- Walau lebih sulit untuk di-debug, Protobuf lebih cocok untuk API modern dari sisi performa, maintainability, dan efisiensi pengembangan
Universalitas dan Keterbatasan JSON
- JSON adalah format teks yang mudah dibaca manusia, sehingga data bisa diperiksa hanya dengan
console.log() sederhana
- Berkat integrasi sempurna dengan web, JSON diadopsi luas di JavaScript dan berbagai framework backend
- JSON menawarkan fleksibilitas untuk menambah, menghapus, atau mengubah tipe field dengan bebas, tetapi hal ini juga membuka kemungkinan ketidakcocokan struktur dan error
- Karena ekosistem tooling-nya kaya, JSON bisa ditangani dengan mudah hanya menggunakan editor teks atau
curl
- Namun, terlepas dari keunggulan tersebut, ada alternatif yang lebih baik dalam hal performa dan type safety
Gambaran Umum Protobuf
- Format serialisasi biner yang dikembangkan oleh Google pada 2001 dan dipublikasikan pada 2008
- Digunakan secara luas di sistem internal dan komunikasi antar-microservice
- Sering ada kesalahpahaman bahwa Protobuf harus dipakai bersama gRPC, padahal Protobuf juga bisa digunakan secara mandiri di HTTP API
- Pada awalnya kurang mudah diakses karena format biner tidak terlihat langsung, tetapi Protobuf sangat unggul dari sisi efisiensi dan stabilitas
Sistem Tipe yang Kuat dan Pembuatan Kode
Efisiensi Serialisasi Biner
- Protobuf diserialisasi sebagai data biner alih-alih teks, sehingga sangat ringkas dan cepat
- Perbandingan ukuran untuk data yang sama (objek
User):
- JSON: 86 byte (68 byte jika spasi dihapus)
- Protobuf: 30 byte
- Penyebab efisiensinya:
- Menggunakan encoding varint untuk angka
- Menggunakan tag numerik, bukan key teks
- Menghapus spasi dan sintaks yang tidak perlu
- Optimasi field opsional
- Hasilnya adalah penghematan bandwidth, respon lebih cepat, hemat data seluler, dan peningkatan pengalaman pengguna
Contoh API Protobuf Berbasis Dart
- Menggunakan paket
shelf untuk membuat HTTP server sederhana yang mengembalikan objek User dalam format Protobuf
- Inti kode server:
- Membuat objek
User() lalu menserialisasikannya dengan writeToBuffer()
- Menetapkan header respons
'content-type': 'application/protobuf'
- Klien menggunakan paket
http dan user.pb.dart untuk mendekode data Protobuf secara langsung
- Karena server dan klien berbagi skema
.proto yang sama, ketidakcocokan struktur data tidak terjadi
- Pendekatan yang sama juga dapat diterapkan di Go, Rust, Kotlin, Swift, C#, dan TypeScript
Keunggulan JSON yang Masih Tersisa
- Protobuf sulit dipahami maknanya tanpa skema
- Karena yang terlihat hanya identifier angka, bukan nama field, format ini sulit dibaca manusia
- Contoh perbandingan:
- JSON:
{ "id": 42, "name": "Alice" }
- Protobuf:
1: 42, 2: "Alice"
- Karena itu, Protobuf memerlukan:
- tool decoding khusus
- manajemen skema dan versioning yang wajib
- Meski begitu, keuntungan performa dan efisiensinya jauh lebih besar
Kesimpulan
- Protobuf adalah teknologi serialisasi yang matang dan berperforma tinggi, serta cukup layak digunakan juga untuk API publik
- Dapat berjalan mandiri di HTTP API biasa tanpa gRPC
- Alat yang meningkatkan performa, robustness, pengurangan error, dan efisiensi pengembangan sekaligus
- Untuk proyek generasi berikutnya, mengadopsi Protobuf sangat layak dipertimbangkan
Belum ada komentar.