Protokol arabellekleri, yapılandırılmış verileri ileriye dönük ve geriye dönük uyumlu bir şekilde serileştirmek için dilden bağımsız, platformdan bağımsız, genişletilebilir bir mekanizma sağlar. Bu, JSON'a benzer, ancak daha küçük ve daha hızlıdır ve yerel dil bağlantıları oluşturur.
Protokol arabellekleri, tanım dilinin (
.proto dosyalarında oluşturulur) bir kombinasyonudur. Proto derleyicinin verilerle arayüz oluşturmak için oluşturduğu kod, dile özel çalışma zamanı kitaplıkları ve bir dosyaya yazılan (veya bir ağ bağlantısı üzerinden gönderilen) verilerin serileştirme biçimi kullanılır.
Protokol Arabellekleri hangi sorunları çözer?
Protokol arabellekleri, boyutu en fazla birkaç megabayt olmak üzere, türe göre yapılandırılmış veri paketleri için bir serileştirme biçimi sağlar. Biçim, hem geçici ağ trafiği hem de uzun süreli veri depolama için uygundur. Protokol arabelleği, mevcut verileri geçersiz kılmadan veya kodun güncellenmesini gerektirmeden yeni bilgilerle genişletilebilir.
Protokol arabellekleri, Google'da en sık kullanılan veri biçimidir. Sunucular arası iletişimlerin yanı sıra diskte verilerin arşivlenmesi için de yaygın olarak kullanılırlar. Protokol arabelleği mesajları ve hizmetleri, mühendis tarafından yazılan
.proto dosyalarıyla tanımlanır. Aşağıda
message örneğini görebilirsiniz:
message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; }
Proto derleyici, karşılık gelen protokol arabelleğini değiştirmek amacıyla çeşitli programlama dillerinde (bu konunun daha sonra Diller Arası Uyumluluk bölümünde ele alınır) kod oluşturmak için
.proto dosyalarında derleme sırasında çağrılır. Oluşturulan her sınıf, her alan için basit erişimciler ve yapının tamamını ham bayta ayrıştırıp ayrıştırma yöntemleri sunar. Aşağıda, oluşturulan bu yöntemleri kullanan bir örnek verilmiştir:
Person john = Person.newBuilder() .setId(1234) .setName("John Doe") .setEmail("firstname.lastname@example.org") .build(); output = new FileOutputStream(args[0]); john.writeTo(output);
Protokol arabellekleri, Google'daki tüm hizmetlerde yaygın olarak kullanıldığından ve bunların içindeki veriler bir süre tutulabildiğinden geriye dönük uyumluluk büyük önem taşır. Protokol arabellekleri, yeni alanların eklenmesi ve mevcut alanların silinmesi de dahil olmak üzere mevcut hizmetleri kesintiye uğratmadan herhangi bir protokol arabelleğine değişiklikler için sorunsuz destek sunar. Bu konu hakkında daha fazla bilgi için bu konunun ilerleyen kısımlarında Kod Güncellemeden Proto Tanımlarını Güncelleme bölümüne bakın.
Protokol Arabelleklerini Kullanmanın Avantajları nelerdir?
Protokol arabellekleri, yapılandırılmış, kayıt benzeri, yazılan verileri dilden bağımsız, platformdan bağımsız, genişletilebilir bir şekilde serileştirmeniz gerektiğinde idealdir. Çoğu zaman iletişim protokollerini tanımlamak (gTB ile birlikte) ve veri depolama için kullanılır.
Protokol arabellekleri kullanmanın avantajlarından bazıları şunlardır:
- Kompakt veri depolama alanı
- Hızlı ayrıştırma
- Birçok programlama dilinde kullanılabilirlik
- Otomatik oluşturulan sınıflar aracılığıyla optimize edilmiş işlevler
Diller Arası Uyumluluk
Aynı mesajlar, desteklenen herhangi bir programlama dilinde yazılmış kodla okunabilir. Bir platformdaki Java programında bir yazılım sisteminden veri yakalayabilir,
.proto tanımına göre serileştirebilir ve daha sonra, bu serileştirilmiş verilerden belirli değerleri başka bir platformda çalışan ayrı bir Python uygulamasında çıkarabilirsiniz.
Aşağıdaki diller doğrudan protokol arabelleği derleyicisinde desteklenir, proto:
Aşağıdaki diller Google tarafından desteklenir ancak projelerin kaynak kodu GitHub depolarında tutulur. Procho derleyici, aşağıdaki diller için eklentiler kullanır:
Ek diller doğrudan Google tarafından değil, diğer GitHub projeleri tarafından desteklenir. Bu diller, Protokol Arabellekleri için Üçüncü Taraf Eklentileri kapsamındadır.
Projeler Arası Destek
Belirli bir projenin kod tabanının dışında kalan
.proto dosyalarında
message türleri tanımlayarak projeler genelinde protokol arabellek kullanabilirsiniz. Yakındaki ekibinizin dışında yaygın olarak kullanılacağını beklediğiniz
message türlerini veya sıralamalarını tanımlıyorsanız bunları bağımlılık olmadan kendi dosyalarına ekleyebilirsiniz.
Kodu Güncellemeden Proto Tanımlarını Güncelleme
Yazılım ürünlerinin geriye dönük uyumlu olması standarttır, ancak ürünlerin uyumlu olması daha az yaygındır.
.proto tanımlarını güncellerken bazı basit uygulamaları uyguladığınız sürece, eski kod yeni eklenen mesajları yoksayarak yeni mesajları sorunsuz bir şekilde okur. Eski kod, silinen alanların varsayılan değerini kullanır ve silinen yinelenen alanlar boş olur. "Tekrarlanan" alanların ne olduğu hakkında bilgi edinmek için bu konunun ilerleyen kısımlarındaki Protokol Arabellek Tanımı Söz Dizimi bölümüne göz atın.
Yeni kodlar da eski mesajları şeffaf bir şekilde okur. Yeni iletiler eski iletilerde bulunmayacak. Bu durumlarda protokol arabellekleri makul bir varsayılan değer sağlar.
Protokol Arabellekleri ne zaman uygun değildir?
Protokol arabelleği tüm verilere sığmaz. Özellikle:
- Protokol arabelleği, tüm iletilerin tek seferde belleğe yüklenebileceğini ve bir nesne grafiğinden daha büyük olmadığını varsayar. Birkaç megabaytı aşan veriler için farklı bir çözüm kullanabilirsiniz. Daha büyük verilerle çalışırken, serileştirilmiş kopyalardan dolayı verilerin birkaç kopyasıyla etkili bir şekilde karşılaşabilirsiniz. Bu da bellek kullanımında şaşırtıcı artışlara neden olabilir.
- Protokol arabellekleri serileştirildiğinde aynı veriler çok sayıda farklı ikili serileştirmeye sahip olabilir. İki mesajı tam olarak ayrıştırmadan eşitlik için karşılaştıramazsınız.
- Mesajlar sıkıştırılmaz. Mesajlar diğer dosyalar gibi sıkıştırılabilir veya gzip'lenebilir. Ancak JPEG ve PNG tarafından kullanılanlar gibi özel amaçlı sıkıştırma algoritmaları uygun türdeki veriler için çok daha küçük dosyalar üretir.
- Protokol arabelleği iletileri, büyük ve çok boyutlu kayan nokta sayıları içeren bilimsel ve mühendislik kullanımlarının çoğunda hem boyut hem de hız açısından maksimum etkiye sahip değildir. Bu uygulamalar için FITS ve benzer biçimlerin ek yükü daha azdır.
- Protokol arabellekleri, Fortran ve IDL gibi bilimsel işlemlerde popüler olan, nesne odaklı olmayan dillerde iyi desteklenmemektedir.
- Protokol arabelleği mesajları, doğası gereği verilerini tanımlamaz ancak tamamen kendi kendine açıklamayı uygulamak için kullanabileceğiniz tamamen yansıtılmış bir şemaya sahiptir. Yani karşılık gelen
.protodosyasına erişimi olmayan birini tam olarak yorumlayamazsınız.
- Protokol arabellekleri, herhangi bir kuruluşun resmi standardı değildir. Bu nedenle, standartların yanı sıra diğer yasal gereksinimlerin veya yasal gereksinimlerin söz konusu olduğu ortamlarda kullanım için uygun değildir.
Protokol Arabelleklerini Kimler Kullanır?
Harici olarak kullanılabilen birçok proje, aşağıdakiler de dahil olmak üzere protokol arabellek kullanır:
Protokol Arabellekleri Nasıl Çalışır?
Aşağıdaki şemada, verilerinizle çalışmak için protokol arabelleklerini nasıl kullandığınız gösterilmektedir.
Şekil 1. Protokol arabellekleri iş akışı
Protokol arabellekleri tarafından oluşturulan kod; dosyalardan ve akışlardan veri almak, verilerden bağımsız değerleri çıkarmak, verilerin mevcut olup olmadığını kontrol etmek, verileri bir dosyaya veya akışa geri göndermek ve diğer yararlı işlevler için yardımcı yöntemler sağlar.
Aşağıdaki kod örnekleri Java'da bu akışa ait bir örneği göstermektedir. Daha önce gösterildiği gibi bu
.proto tanımıdır:
message Person { optional string name = 1; optional int32 id = 2; optional string email = 3; }
Bu
.proto dosyası derlenirken, aşağıdaki Java kodunda olduğu gibi yeni örnekler oluşturmak için kullanabileceğiniz bir
Builder sınıfı oluşturulur:
Person john = Person.newBuilder() .setId(1234) .setName("John Doe") .setEmail("email@example.com") .build(); output = new FileOutputStream(args[0]); john.writeTo(output);
Ardından, protokol arabelleğinin C++ gibi diğer dillerde oluşturduğu yöntemleri kullanarak verileri seri durumdan çıkarabilirsiniz:
Person john; fstream input(argv[1], ios::in | ios::binary); john.ParseFromIstream(&input); int id = john.id(); std::string name = john.name(); std::string email = john.email();
Protokol Arabellekleri Tanım Söz Dizimi
.proto dosyalarını tanımlarken, bir alanın
optional veya
repeated (proto2 ve proto3) veya
singular (proto3) olduğunu belirtebilirsiniz. (Alanı
required olarak ayarlama seçeneği proto3'te yok ve proto2'de kesinlikle önerilmiyor. Bu konuyla ilgili daha fazla bilgi için Alan Kuralları Belirtme bölümündeki "Zorunluluk Sonsuzdur" bölümüne bakın.)
Bir alanın seçenek/tekrarlanabilirliğini ayarladıktan sonra veri türünü belirtirsiniz. Protokol arabelleği, tam sayılar, boole'ler ve kayan'lar gibi normal temel veri türlerini destekler. Tam liste için Skaler Değer Türleri'ne bakın.
Bir alan şunlardan biri de olabilir:
- Tanımlanan bölümleri (ör. yinelenen veri grupları) iç içe yerleştirebilmek için bir
messagetürü kullanın.
- Bir
enumtürü, böylece aralarından seçim yapabileceğiniz bir değer grubu belirtebilirsiniz.
- Bir iletinin çok sayıda isteğe bağlı alanı olduğunda ve aynı anda en fazla bir alanda ayarlanacaksa kullanabileceğiniz
oneoftürü.
- Tanımınıza anahtar/değer çiftleri eklemek için bir
maptürü.
Proto2'de, mesajlar uzantıların mesajın dışındaki alanları tanımlamasına izin verebilir. Örneğin, protobuf kitaplığının dahili mesaj şeması, uzantılara özel, kullanıma özgü seçenekler için izin verir.
Seçenek ve alan türünü ayarladıktan sonra bir alan numarası atarsınız. Alan numaraları yeniden değerlendirilemez veya yeniden kullanılamaz. Bir alanı silerseniz kullanıcının numarayı yanlışlıkla yeniden kullanmasını önlemek için alan numarasını ayırtmanız gerekir.
Ek Veri Türü Desteği
Protokol arabellekleri, hem değişken uzunluklu kodlama hem de sabit boyutlar kullanan tam sayılar dahil olmak üzere birçok skaler değer türünü destekler. Ayrıca, bir alana atayabileceğiniz veri türleri olan iletileri tanımlayarak kendi birleşik veri türlerinizi de oluşturabilirsiniz. Basit ve birleşik değer türlerine ek olarak, yaygın olarak kullanılan birkaç yaygın tür yayınlanır.
Ortak Türler
Duration42 saniye gibi imzalanmış ve sabit bir zaman aralığıdır.
Timestamp2017-01-15T01:30:15.01Z gibi herhangi bir saat dilimi veya takvimden bağımsız olarak bir zamandır.
Interval, saat dilimi veya takvimden bağımsız bir zaman aralığıdır (ör. 2017-01-15T01:30:15.01Z - 2017-01-16T02:30:15.01Z).
Date, 19.09.2025 gibi tam bir takvim tarihidir.
DayOfWeek, haftanın günü (ör. Pazartesi) olmalıdır.
TimeOfDay, 10:42:23 gibi günün bir saatidir.
LatLng37.386051 enlem ve -122.083855 boylam gibi bir enlem/boylam çiftidir.
Money, para birimi türüyle (ör. 42 ABD doları) para tutarıdır.
PostalAddress1600 Amphitheatre Parkway Mountain View, CA 94043 ABD gibi bir posta adresidir.
Color, RGBA renk alanında bir renktir.
Month, yılın ilk ayıdır (ör. Nisan).
Protokol Arabellekleri Açık Kaynak Felsefesi
Protokol arabelleği, 2008 yılında Google dışında geliştiricilere, dahili olarak elde ettiğimiz avantajlardan yararlanma yolu olarak açık kaynaklıydı. Dilde düzenli olarak yaptığımız güncellemelerle açık kaynak topluluğunu destekliyoruz. Bu değişiklikleri dahili gereksinimlerimizi desteklemek için de yapıyoruz. Harici geliştiricilerden gelen pull alma isteklerini kabul etsek de Google'ın özel ihtiyaçlarına uymayan özellik isteklerine ve hata düzeltmelerine her zaman öncelik veremeyiz.