protobuf ve gRPC


102

Protobuf ve gRPC'yi ve her ikisini de nasıl kullanabileceğimi anlamaya çalışıyorum. Aşağıdakileri anlamama yardım eder misin:

  • OSI modelini göz önünde bulundurursak, örneğin 4. katmanda Protobuf nerede?
  • Bir mesaj aktarımı aracılığıyla "akış" nasıldır, gRPC protobuf'un kaçırdığını ne yapıyor?
  • Gönderen protobuf kullanıyorsa, sunucu gRPC kullanabilir mi veya gRPC yalnızca bir gRPC istemcisinin sunabileceği bir şey ekler mi?
  • GRPC eşzamanlı ve eşzamansız iletişimi mümkün kılabilirse, Protobuf yalnızca sıralama içindir ve bu nedenle durumla ilgisi yoktur - doğru mu yanlış mı?
  • GRPC'yi REST veya GraphQL yerine iletişim kuran bir ön uç uygulamasında kullanabilir miyim?

Bunu zaten biliyorum veya bildiğimi varsayıyorum:

Protobuf

  • Veri değişimi için ikili protokol
  • Google tarafından tasarlandı
  • Marshall mesajını kaldırmak için istemcide ve sunucuda oluşturulan "Struct" benzeri açıklamayı kullanır

gRPC

  • Protobuf (v3) kullanır
  • Yine Google'dan
  • RPC çağrıları için çerçeve
  • HTTP / 2'yi de kullanır
  • Senkron ve asenkron iletişim mümkün

Teknolojiyi zaten kullanan biri için yine bunun kolay bir soru olduğunu varsayıyorum. Yine de bana karşı sabırlı olduğun ve bana yardım ettiğin için teşekkür ederim. Ayrıca, teknolojilerin herhangi bir ağ derinliği incelemesi için gerçekten minnettar olurum.

Yanıtlar:


85

Protokol arabellekleri bir Arabirim Tanımlama Dili ve serileştirme kitaplığıdır:

  • Veri yapılarınızı IDL'sinde tanımlarsınız, yani kullanmak istediğiniz veri nesnelerini tanımlarsınız.
  • Veri nesnelerinizi ikili sisteme çevirmek için rutinler sağlar, örneğin diskten veri yazmak / okumak için

gRPC aynı IDL'yi kullanır ancak veri türleri olarak Protobuf veri yapılarını kullanarak Uzaktan Prosedür Çağrısı yöntemi imzalarını tanımlamanıza olanak tanıyan "rpc" sözdizimini ekler:

  • Veri yapılarınızı siz tanımlarsınız
  • Rpc yöntemi tanımlarınızı eklersiniz
  • Bir ağ üzerinden yöntem imzalarını sunmak ve çağırmak için kod sağlar
  • Gerekirse veri nesnelerini Protobuf ile manuel olarak seri hale getirebilirsiniz.

Sorulara cevap olarak:

  1. gRPC, 5., 6. ve 7. katmanlarda çalışır. Protobuf, 6. katmanda çalışır.
  2. "Mesaj transferi" dediğinizde, Protobuf transferin kendisiyle ilgilenmez. Herhangi bir veri aktarımının her iki ucunda da çalışır, baytları nesnelere dönüştürür
  3. GRPC'yi varsayılan olarak kullanmak, Protobuf kullandığınız anlamına gelir . GRPC ile birlikte çalışmak için Protobuf kullanan ancak gRPC kullanmayan kendi istemcinizi yazabilir veya diğer serileştiricileri gRPC'ye ekleyebilirsiniz - ancak gRPC'yi kullanmak daha kolay olacaktır.
  4. Doğru
  5. Evet yapabilirsin

Lütfen bana insanların hangi "Katmanlar" dan bahsettiğinizi söyler misiniz? Lütfen bu kavramı ayrıntılı olarak anlamak için bana bağlantı verin. Teşekkürler.
Millie Hudson

OSI modeli - soruya bir bağlantı ekledi. GRPC'nin 5. ve 6. katmanlara ait olup olmadığı tartışmalı çünkü katman 7 protokolünü ( HTTP/2) kullanıyor, ancak kesinlikle bu katmanların işlerini yapıyor.
Peter Wishart

67

Aslında, gRPC ve Protobuf tamamen farklı 2 şeydir. Basitleştirmeme izin verin:

  • gRPC, bir istemcinin ve bir sunucunun etkileşim kurma biçimini yönetir (tıpkı bir REST API'si olan bir web istemcisi / sunucusu gibi)
  • protobuf yalnızca bir serileştirme / seriyi kaldırma aracıdır (tıpkı JSON gibi)

gRPC'nin 2 tarafı vardır: bir sunucu tarafı ve bir sunucuyu arayabilen bir istemci tarafı. Sunucu, RPC'leri (yani, uzaktan arayabileceğiniz işlevler) açığa çıkarır. Ve orada pek çok seçeneğiniz var: iletişimi güvence altına alabilirsiniz (TLS kullanarak), kimlik doğrulama katmanı ekleyebilir (önleyiciler kullanarak), ...

İstemci / sunucu olması gerekmeyen herhangi bir programın içinde protobuf kullanabilirsiniz. Veri alışverişi yapmanız gerekiyorsa ve bunların güçlü bir şekilde yazılmasını istiyorsanız, protobuf güzel bir seçenektir (hızlı ve güvenilir).

Bununla birlikte, güzel bir istemci / sunucu sistemi oluşturmak için her ikisini de birleştirebilirsiniz: gRPC, istemci / sunucu kodunuz ve veri protokolünüzün protobufu olacaktır.

Not: Bu makaleyi , adım adım Go kullanarak gRPC ve protobuf ile bir istemci / sunucunun nasıl oluşturulabileceğini göstermek için yazdım .


3
Teşekkürler, bu bir örnek uygulamama yardımcı oluyor.
lony

7

grpc , google tarafından bir çerçeve derlemesidir ve Google'ın kendisinden üretim projelerinde kullanılır ve #HyperledgerFabric grpc ile oluşturulmuştur grpc ile oluşturulmuş birçok açık kaynak uygulaması vardır

protobuff , json gibi bir veri sunumudur , bu da google tarafından üretilmiştir, aslında üretim projelerinde binlerce proto dosyası oluşturulmuştur.

grpc

  • gRPC, google tarafından geliştirilen açık kaynaklı bir çerçevedir
  • RPC için İstek ve Yanıt oluşturmamızı ve geri kalanını çerçeve ile halletmemizi sağlar
  • REST CRUD odaklıdır ancak grpc API odaklıdır (kısıtlama yoktur)
  • HTTP / 2 üzerine inşa edin
  • >>>>> Kimlik Doğrulama, Yük Dengeleme, İzleme, günlük kaydı sağlar
  • [HTTP / 2]
    • HTTP1.1, uzun zaman önce 1997'de yayınlandı
    • HTTP1, her istekte bir sunucuya yeni bir TCP bağlantısı açar
    • Başlıkları sıkıştırmaz
    • NO server push, sadece Req, Res ile çalışır
    • 2015'te yayınlanan HTTP2 (SPDY)
    • Çoklamayı destekler
    • istemci ve sunucu, iletileri aynı TCP bağlantısı üzerinden paralel olarak itebilir
    • Gecikmeyi büyük ölçüde azaltır
    • HTTP2, başlık sıkıştırmasını destekler
    • HTTP2 ikilidir
      • proto buff ikili olduğundan HTTP2 için harika bir eşleşme
  • [TİPLER]
    • Tekli
    • istemci akışı
    • sunucu akışı
    • Çift yönlü akış
    • grpc sunucuları varsayılan olarak Async'dir
    • grpc istemcileri senkronize veya Async olabilir

protobuff

  • Protokol arabellekleri dilden bağımsızdır
  • Ayrıştırma protokolü arabellekleri (ikili format) daha az CPU yoğun
  • [Adlandırma]
    • Mesaj isimleri için deve kılıfı kullanın
    • alanlar için alt çizgi_seperated
    • Enumlar için devetüyü ve değer adları için CAPITAL_WITH_UNDERSCORE kullanın
  • [Yorumlar]
    • Destek //
    • Destek /* */
  • [Avantajlar]
    • Veriler tamamen yazılmıştır
    • Veriler tamamen sıkıştırılır (daha az bant genişliği kullanımı)
    • Kodu oluşturmak ve kodu okumak için şema (mesaj) gereklidir
    • Belgeler şemaya yerleştirilebilir
    • Veriler herhangi bir dilde okunabilir
    • Şema her an güvenli bir şekilde gelişebilir
    • XML'den daha hızlı
    • kod sizin için otomatik olarak üretilir
    • Google proto buff'ı icat etti, 48000 protobuf mesajı ve 12000.proto dosyası kullanıyor
    • Grpc dahil olmak üzere birçok RPC çerçevesi veri alışverişinde bulunmak için protokol arabellekleri kullanır

3
Sıkıştırma, CPU kullanımını AZALTMAZ. Serileştirmedeki verileri göndermek veya kullanmak için sıkıştırmanız ve açmanız gerekir - bu da CPU'yu YAPAR .. Sıkıştırmanın sizin için yaptığı, serileştirilmiş ayak izini azaltmak, potansiyel bellek baskısını azaltmak, diske serileştirmek için kullanılıyorsa disk kullanımını veya daha fazlasını yapmaktır. tel sinyali.
Svartalf

@Svartalf bunu düzeltmek için düzenlendi. Gösterdiğiniz için teşekkürler!
swrobel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.