- Web API’lerinin fiili standardı haline gelen JSON, okunması kolay ve esnek olsa da performans ve kararlılık açısından sınırlara sahip
- Protobuf (Protocol Buffers), katı tip tanımı ve otomatik kod üretimi sayesinde veri yapısını açık biçimde garanti eder
- İkili serileştirme kullanarak JSON’a kıyasla veri boyutunu yaklaşık 3 kat veya daha fazla azaltır ve iletim hızını artırır
- Sunucu ve istemci aynı .proto şemasını paylaştığı için tip uyuşmazlığı veya manuel doğrulama gerekmez
- Hata ayıklama daha zor olsa da performans, bakım kolaylığı ve geliştirme verimliliği açısından Protobuf modern API’ler için daha uygundur
JSON’un yaygınlığı ve sınırları
- JSON, insanın kolay okuyabildiği bir metin formatıdır; veriyi yalnızca basit bir
console.log() ile bile kontrol etmek mümkündür
- Web ile kusursuz entegrasyonu sayesinde JavaScript ve backend framework ekosisteminde geniş çapta benimsenmiştir
- Alan ekleme-silme-tip değiştirme konusunda serbestlik sağlayan esneklik sunar, ancak bu da yapı uyuşmazlığına veya hatalara yol açabilir
- Araç ekosistemi zengindir; yalnızca bir metin editörü veya
curl ile bile kolayca çalışılabilir
- Ancak bu avantajlara rağmen performans ve tip güvenliği açısından daha iyi alternatifler vardır
Protobuf’a genel bakış
- Google tarafından 2001’de geliştirilen ve 2008’de yayımlanan bir ikili serileştirme formatı
- Dahili sistemlerde ve mikroservisler arası iletişimde yaygın olarak kullanılır
- Sıklıkla gRPC ile birlikte kullanılmak zorunda olduğu sanılır, ancak Protobuf bağımsız olarak HTTP API’lerinde de kullanılabilir
- Başlangıçta ikili formatın görünmezliği nedeniyle erişilebilirliği düşük görünse de verimlilik ve kararlılık açısından güçlüdür
Güçlü tip sistemi ve kod üretimi
İkili serileştirmenin verimliliği
- Protobuf, metin yerine ikili veri olarak serileştirildiği için son derece kompakt ve hızlıdır
- Aynı verinin (
User nesnesi) boyut karşılaştırması:
- JSON: 86 bayt (boşluklar kaldırıldığında 68 bayt)
- Protobuf: 30 bayt
- Verimliliğin nedenleri:
- Sayılar için varint encoding kullanılması
- Metin anahtarlar yerine sayısal etiketler kullanılması
- Boşlukların ve gereksiz sözdiziminin kaldırılması
- Opsiyonel alan optimizasyonu
- Sonuç olarak bant genişliği tasarrufu, yanıt hızında artış, mobil veri kullanımında azalma ve kullanıcı deneyiminde iyileşme sağlar
Dart tabanlı Protobuf API örneği
shelf paketi kullanılarak basit bir HTTP sunucusu kurulup User nesnesi Protobuf olarak döndürülür
- Sunucu kodunun özü:
User() nesnesi oluşturulur ve writeToBuffer() ile serileştirilir
- Yanıt başlığında
'content-type': 'application/protobuf' belirtilir
- İstemci,
http paketi ve user.pb.dart kullanarak Protobuf verisini doğrudan decode eder
- Sunucu ve istemci aynı
.proto şemasını paylaştığı için veri yapısı uyuşmazlığı oluşmaz
- Aynı yaklaşım Go, Rust, Kotlin, Swift, C#, TypeScript gibi dillerde de aynı şekilde uygulanabilir
JSON’un kalan avantajları
- Protobuf’ta şema olmadan anlamı yorumlamak zordur
- Alan adları yerine yalnızca sayısal tanımlayıcılar göründüğü için insan tarafından okunması zordur
- Karşılaştırma örneği:
- JSON:
{ "id": 42, "name": "Alice" }
- Protobuf:
1: 42, 2: "Alice"
- Bu yüzden Protobuf için:
- Özel decode araçları gerekir
- Şema yönetimi ve sürümleme zorunludur
- Buna rağmen performans ve verimlilik avantajları çok daha büyüktür
Sonuç
- Protobuf, olgun ve yüksek performanslı bir serileştirme teknolojisidir ve açık API’lerde de rahatlıkla kullanılabilir
- gRPC olmadan da genel HTTP API içinde bağımsız şekilde çalışır
- Performansı, sağlamlığı, hata azaltımını ve geliştirme verimliliğini birlikte iyileştiren bir araçtır
- Yeni nesil projelerde Protobuf’u benimsemek için fazlasıyla geçerli nedenler vardır
Henüz yorum yok.