Protobuf — apa itu, format data biner dan prinsip kerja

Penulis: IT Sectr Diterbitkan: 2026-03-08 Waktu membaca: 8 mnt

Protocol Buffers (Protobuf) adalah format serialisasi biner untuk data terstruktur, dikembangkan oleh Google untuk pertukaran informasi yang efisien antar layanan. Format ini memerlukan definisi skema sebelumnya dalam file .proto, dari mana kode dihasilkan untuk berbagai bahasa. Menurut dokumentasi resmi Google, Protobuf memberikan ukuran pesan 3-10 kali lebih kecil dari JSON. Protobuf digunakan di gRPC, Google Maps, dan ribuan layanan internal.

Poin Utama

  • Protobuf — format biner Google untuk serialisasi dengan representasi data yang ringkas
  • Skema .proto — deskripsi struktur data yang diketik secara ketat dengan kompilasi ke kode
  • Kinerja — serialisasi 3-10 kali lebih cepat dan lebih ringkas dari JSON
  • Kompatibilitas mundur — evolusi skema tanpa merusak klien yang ada
  • gRPC — teknologi transportasi utama untuk Protobuf di layanan mikro

Apa itu Protocol Buffers?

Protocol Buffers adalah mekanisme serialisasi data terstruktur yang dikembangkan oleh Google, mirip dengan JSON dan XML, tetapi dengan perbedaan mendasar: data dikodekan dalam format biner. Ini berarti pesan Protobuf tidak dapat dibaca dengan mata telanjang, tetapi memakan lebih sedikit ruang dan diproses lebih cepat daripada padanan tekstual.

Protobuf diciptakan di internal Google untuk memecahkan masalah kinerja dalam pertukaran data antar layanan. Pada tahun 2008, teknologi ini menjadi proyek open-source dengan dukungan untuk banyak bahasa: C++, Java, Python, Go, JavaScript, Kotlin, Swift, Dart, dan lainnya. Versi proto3, dirilis pada tahun 2016, menyederhanakan sintaks dan menambahkan dukungan untuk lebih banyak bahasa.

Perbedaan utama antara Protobuf dan JSON adalah kebutuhan untuk mendefinisikan skema sebelum memulai pertukaran data. File skema (.proto) menjelaskan struktur pesan: bidang, tipe, dan nomor bidang unik. Dari skema ini, kompiler protoc menghasilkan kelas dalam bahasa target untuk serialisasi dan deserialisasi.

Ekosistem Protobuf

  • gRPC — framework RPC berkinerja tinggi yang secara default menggunakan Protobuf
  • protoc — kompiler skema .proto ke kode dalam berbagai bahasa pemrograman
  • Google API — sebagian besar API publik Google menggunakan Protobuf
  • Envoy Proxy — menggunakan Protobuf untuk konfigurasi dan pertukaran data

Arsitektur Protobuf

Arsitektur Protobuf mencakup tiga komponen kunci: bahasa definisi skema (.proto), kompiler protoc, dan pustaka runtime untuk bahasa tertentu. Pengembang menjelaskan struktur data dalam file .proto, menjalankan kompilasi, dan mendapatkan kelas siap pakai untuk bekerja dengan data ini.

Setiap bidang dalam pesan Protobuf memiliki nomor unik (field number) — ini bukan nomor urut, tetapi tag yang digunakan dalam format biner untuk mengidentifikasi bidang. Nomor 1 hingga 15 dikodekan dengan satu byte, nomor 16 hingga 2047 dengan dua byte. Oleh karena itu, bidang penting dengan frekuensi penggunaan tinggi sebaiknya diberi nomor 1 hingga 15 untuk mengoptimalkan ukuran.

Tipe Data Protobuf

Protobuf mendukung berbagai macam tipe: skalar (int32, int64, float, double, bool, string, bytes), enumerasi (enum), komposit (message), dan khusus (oneof, map). Setiap tipe memiliki representasi biner tertentu yang dioptimalkan untuk skenario penggunaan yang sesuai.

Tipe .proto Tipe C++ Java/Kotlin Deskripsi
double double double Angka floating-point 64-bit
float float float Angka floating-point 32-bit
int32 int32 int 32-bit, variable-length encoding
int64 int64 long 64-bit, variable-length encoding
string string String String UTF-8
bytes string ByteString Byte sembarang
bool bool boolean true / false

Keunggulan format biner

Protobuf memberikan tiga keunggulan utama dibandingkan format teks: ukuran pesan, kecepatan serialisasi, dan pengetikan ketat. Dalam sistem dengan beban tinggi dan aplikasi mobile dengan lalu lintas terbatas, keunggulan ini menjadi kritis.

Representasi biner Protobuf menggunakan variable-length encoding (Varint) untuk angka: angka kecil memakan 1 byte, angka besar hingga 10 byte. Ini memungkinkan pengkodean yang efisien untuk pengidentifikasi, bendera, dan penghitung yang dalam JSON atau XML akan memakan puluhan byte sebagai string teks. Misalnya, angka 150 dalam Protobuf memakan 2 byte, dalam JSON 3 byte (sebagai teks “150”), dalam XML 3 byte + tag.

Keunggulan tambahan adalah kompatibilitas mundur. Menambahkan bidang baru ke skema tidak merusak klien lama: mereka hanya mengabaikan bidang yang tidak dikenal. Menghapus bidang hanya memerlukan reservasi nomornya untuk menghindari bentrokan di masa depan.

Mendefinisikan skema .proto

Skema .proto menjelaskan struktur data dalam bahasa khusus. File dimulai dengan menentukan sintaks (proto3), paket, dan impor dependensi. Setiap pesan didefinisikan dengan kata kunci message dengan bidang, di mana setiap bidang memiliki tipe, nama, dan nomor unik.

Aturan skema yang baik: nomor bidang 1 hingga 15 untuk bidang yang sering digunakan, nama yang bermakna, pengelompokan bidang terkait dalam message terpisah, penggunaan oneof untuk bidang yang hanya dapat menjadi salah satu dari beberapa varian.

protobuf
syntax = "proto3";

package mobileapp;

message User {
  string user_id = 1;
  string name = 2;
  string email = 3;
  int32 age = 4;
  UserRole role = 5;
  repeated string tags = 6;
  map<string, string> metadata = 7;
}

enum UserRole {
  USER_ROLE_UNSPECIFIED = 0;
  USER_ROLE_USER = 1;
  USER_ROLE_ADMIN = 2;
  USER_ROLE_MODERATOR = 3;
}

Pesan bersarang

Pesan dapat bersarang: bidang profile bertipe Profile akan berisi data pengguna. Dukungan untuk bersarang memungkinkan deskripsi struktur hierarkis yang kompleks tanpa duplikasi definisi.

protobuf
syntax = "proto3";

package mobileapp;

message Order {
  string order_id = 1;
  repeated OrderItem items = 2;
  double total_price = 3;
  PaymentInfo payment = 4;
}

message OrderItem {
  string product_id = 1;
  string title = 2;
  int32 quantity = 3;
  double price = 4;
}

message PaymentInfo {
  string method = 1;
  string transaction_id = 2;
  double amount = 3;
}

Generasi kode dari .proto

Kompiler protoc mengonversi file .proto menjadi kode sumber dalam bahasa target. Untuk Kotlin/Java digunakan parameter --java_out, untuk Swift --swift_out (melalui plugin Apple Swift Protobuf), untuk Dart --dart_out. Kelas yang dihasilkan berisi metode builder untuk membangun pesan dan metode serialisasi/deserialisasi.

Di Android, untuk bekerja dengan Protobuf digunakan plugin com.google.protobuf versi 0.9+ di Gradle. Setelah menambahkan plugin dan menentukan file .proto, kompilasi secara otomatis menghasilkan kelas Kotlin yang siap digunakan dalam aplikasi.

kotlin
import com.google.protobuf.kotlin.toByteString
import com.example.mobileapp.UserOuterClass.User

fun createUser(): User {
    return User.newBuilder()
        .setUserId("usr_001")
        .setName("IT Sectr")
        .setEmail("team@itsectr.com")
        .setAge(5)
        .setRole(UserOuterClass.UserRole.USER_ROLE_ADMIN)
        .addTags("mobile")
        .addTags("backend")
        .build()
}

fun serializeAndDeserialize(user: User): User {
    // Serialisasi ke format biner
    val bytes = user.toByteArray()

    // Deserialisasi dari format biner
    return User.parseFrom(bytes)
}

Contoh penggunaan Protobuf

Protobuf sangat efisien dalam arsitektur layanan mikro dan aplikasi mobile. Mari pertimbangkan skenario umum: aplikasi mobile menerima daftar produk dari server melalui gRPC. Pesan Protobuf berisi informasi produk, termasuk pengidentifikasi, nama, harga, dan kategori. Format biner mengurangi ukuran respons 5-8 kali dibandingkan dengan JSON.

Layanan gRPC di Kotlin

Contoh layanan gRPC dengan Protobuf di sisi server. Layanan mendeklarasikan metode RPC GetProducts yang menerima permintaan dengan parameter paginasi dan mengembalikan daftar produk. Implementasi di Kotlin menggunakan kelas yang dihasilkan untuk bekerja dengan permintaan dan respons.

kotlin
import com.example.mobileapp.ProductServiceGrpcKt
import com.example.mobileapp.ProductOuterClass.Product
import com.example.mobileapp.ProductOuterClass.GetProductsRequest
import com.example.mobileapp.ProductOuterClass.GetProductsResponse

class ProductService : ProductServiceGrpcKt.ProductServiceCoroutineImplBase() {

    override suspend fun getProducts(
        request: GetProductsRequest
    ): GetProductsResponse {
        val products = fetchProductsFromDb(
            page = request.page,
            limit = request.limit
        )

        return GetProductsResponse.newBuilder()
            .addAllProducts(products)
            .setTotalCount(products.size)
            .build()
    }
}

Konfigurasi Protobuf di proyek Android

Konfigurasi Protobuf di proyek Android dilakukan melalui plugin Gradle com.google.protobuf. Plugin secara otomatis menjalankan kompiler protoc saat kompilasi dan menghasilkan kelas Kotlin dari file .proto. Untuk bekerja, plugin perlu ditambahkan ke build.gradle tingkat proyek dan diterapkan di modul aplikasi.

Setelah mengonfigurasi Gradle, file .proto ditempatkan di direktori src/main/proto. Kompiler protoc memprosesnya pada setiap kompilasi, menghasilkan kelas Kotlin yang dapat digunakan dalam kode aplikasi. Penting untuk menentukan versi protobuf dan protoc dengan benar untuk menghindari konflik dependensi dengan pustaka lain proyek.

Untuk proyek iOS, Protobuf dihubungkan melalui CocoaPods atau Swift Package Manager. Plugin Swift Protobuf secara otomatis menghasilkan struktur Swift yang sesuai dengan protokol Codable. Di proyek Dart untuk Flutter, digunakan paket protobuf, dan kompilasi dilakukan melalui dart run protoc_plugin.

Pertanyaan Umum

Apa perbedaan antara Protobuf dan JSON?

Protobuf — format biner dengan skema wajib, 3-10 kali lebih ringkas dari JSON. JSON — tekstual, dapat dibaca manusia, tidak memerlukan skema. Protobuf lebih cepat diserialisasi dan dideserialisasi, tetapi memerlukan kompilasi file .proto. JSON lebih mudah di-debug dan tidak memerlukan konfigurasi awal.

Bagaimana cara menginstal kompiler protoc?

Unduh protoc dari rilis GitHub protobuf untuk platform Anda. Untuk macOS instal melalui brew install protobuf. Untuk Windows unduh arsip zip dan tambahkan protoc.exe ke PATH. Untuk Android/Kotlin gunakan plugin Gradle com.google.protobuf yang secara otomatis menjalankan kompilasi saat pembangunan.

Apa itu gRPC dan bagaimana hubungannya dengan Protobuf?

gRPC adalah framework RPC berkinerja tinggi dari Google yang menggunakan Protobuf sebagai bahasa antarmuka (IDL) dan format serialisasi. gRPC mendefinisikan layanan dan metode RPC dalam file .proto, menghasilkan kode klien dan server, mendukung streaming, dan protokol biner.

Bahasa apa saja yang didukung Protobuf?

Google secara resmi mendukung: C++, Java, Kotlin, Python, Go, Ruby, C#, PHP, JavaScript, Objective-C, Swift, dan Dart. Komunitas telah mengembangkan dukungan untuk Rust, TypeScript, Scala, Lua, dan bahasa lainnya. Untuk pengembangan mobile tersedia Kotlin/Java (Android) dan Swift/Objective-C (iOS).

Bagaimana memastikan kompatibilitas mundur skema?

Protobuf mendukung kompatibilitas mundur melalui aturan: jangan mengubah nomor bidang, jangan menghapus bidang (gunakan reserved), tambahkan bidang baru dengan nomor baru. Klien lama mengabaikan bidang yang tidak dikenal, klien baru menerima nilai default untuk bidang lama yang hilang.

Kesimpulan

  • Protocol Buffers — format serialisasi biner dari Google dengan skema data wajib
  • Ukuran pesan 3-10 kali lebih kecil dari JSON berkat pengkodean Varint
  • Kecepatan serialisasi dan deserialisasi lebih tinggi dari format teks
  • Skema .proto memberikan pengetikan ketat dan generasi kode untuk 12+ bahasa
  • Kompatibilitas mundur memungkinkan evolusi API tanpa merusak klien
  • gRPC menggunakan Protobuf sebagai format standar untuk komunikasi layanan mikro
  • Ideal untuk sistem dengan beban tinggi dan aplikasi mobile dengan lalu lintas terbatas

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga