38 puan yazan GN⁺ 2025-12-05 | Henüz yorum yok. | WhatsApp'ta paylaş
  • 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

  • Protobuf, .proto dosyaları üzerinden veri yapısını açıkça tanımlar
    • Her alanın katı bir tipi, sayısal tanımlayıcısı ve sabit bir adı vardır
  • Örnek:
    message User {
      int32 id = 1;
      string name = 2;
      string email = 3;
      bool isActive = 4;
    }
    
  • protoc komutuyla Dart, TypeScript, Kotlin, Swift, C#, Go, Rust gibi birçok dil için otomatik kod üretimi desteklenir
  • Üretilen kodla serileştirme (writeToBuffer) ve ters serileştirme (fromBuffer) yapılır; manuel doğrulama veya parse etme gerekmez
  • Sonuç olarak aynı anda hem zamandan tasarruf hem de bakım kolaylığında artış sağlanır

İ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.

Henüz yorum yok.