Thrift ve Protokol Tamponları arasındaki en büyük farklar nelerdir?


286

Google'ın Protokol Tamponlarına karşı Apache Thrift'in en büyük artıları ve eksileri nelerdir?


4
Bir yan not olarak, Marc Gravell Googles protobuf denilen protobuf.net ile çalışmak için bir kütüphane korur ve en bulunuyor code.google.com/p/protobuf-net
RCIX

5
Bu soru ve aşağıdaki cevaplardan bazıları yaklaşık 6 yaşında. Muhtemelen o zamandan beri çok şey değişti.
AlikElzin-kilaka

Yanıtlar:


159

Her ikisi de aynı özelliklerin çoğunu sunar; ancak, bazı farklılıklar vardır:

  • Tasarruf 'istisnaları' destekler
  • Protokol Tamponları çok daha iyi belgelere / örneklere sahiptir
  • Tasarruf yerleşik bir Settip var
  • Protokol Tamponları "uzantılara" izin verir - harici bir protokolü ek alanlar eklemek için genişletirken harici kodun değerler üzerinde çalışmasına izin verebilirsiniz. Thrift'te bunu yapmanın bir yolu yok
  • Protokol Tamponlarının okunmasını çok daha kolay buluyorum

Temel olarak, oldukça eşdeğerdir (Protokol Tamponları ile okuduğumdan biraz daha verimli).


16
Bu sunum 2013 itibariyle
BAR

13
tasarruf 10 dil daha destekliyor
Elijah Saounkine

1
Bazı diller için uzantı ekleyebilirsiniz. Örneğin Thrift, C # için genişletilmesi kolay kısmi sınıflar üretir. Ancak, genel kural bu değil, bu doğru.
JensG

grpc 1.0 (proto3) desteği mapde
KindDragon

85

Bir diğer önemli fark, varsayılan olarak desteklenen dillerdir.

  • Protokol Tamponları: Java, Android Java, C ++, Python, Ruby, C #, Git, Objective-C, Node.js
  • Tasarruf: Java, C ++, Python, Ruby, C #, Git, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

Her ikisi de diğer platformlara genişletilebilir, ancak bunlar kutunun dışında mevcut olan dil bağlamalarıdır.


16
protobuf mükemmel yakut desteğine sahiptir github.com/macks/ruby-protobuf ve code.google.com/p/ruby-protobuf . C # (3.5) ve Ruby, C # veri serileştirme ve gerektiğinde Ruby serisini kaldırma ve görev üzerinde çalışan protobuf kullanıyorum.
Bryan Bailliache

6
code.google.com/p/protobuf/wiki/ThirdPartyAddOns , PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml plus Actiona Script, Common Lisp, Go, Lua, Mathlab, Visual Basic, Scala'yı listeler. Bunların hepsinin üçüncü taraf uygulamaları olduğunu düşündüm.
Igor Gatis

Protobuf C ++ dosyalarını doğrudan objektif c'de kullanabilirsiniz (hem iOS hem de OS X için) bu
qn'yi

Gördüğüm code.google.com/p/protobuf-net sık C # için protobuf bağlantı noktası olarak belirtilen, ancak tamamen doğru değil. Protobuf ve Thrift'in önemli özelliklerinden biri dış yapı tanımıdır, bu nedenle aynı tanım farklı diller tarafından kullanılabilir. protobuf-net bu özelliği desteklemez çünkü yapı tanımını C # kodunun içine gömer.
Andriy Tylychko

@AndyT: Bu tartışmalıdır - yapı tanımının desteklemek istediğiniz tüm diller için HARİCİ olması bir avantaj olup olmadığına bağlıdır. Protobuf-net ile veri yapınızı C # içinde tanımlarsınız ve .proto dosyasını bundan sonra diğer dillerde destek oluşturmak için kullanabilirsiniz. Ben çok C # merkezli ve Android / Java mevcut büyük bir .Net uygulaması ile entegre sürecinde olduğum için, bu bir avantaj olarak düşünün. Bu yüzden C # sınıflarımı kesin yapı tanımları olarak görmeye devam etmek istiyorum.
RenniePet

73

RPC başka bir önemli farktır. Thrift, Protokol Tamponlarının çoğunlukla tek başına bir veri değişim formatı olarak tasarlandığı yerlerde RPC istemcilerini ve sunucularını uygulamak için kod üretir.


9
Bu doğru değil. Protokol arabellekleri bir RPC hizmeti API'sini tanımlar ve iletiyi iletmek için kullanılabilecek bazı kütüphaneler vardır.
Stephen

7
Protobuf'un RPC'nin tanımlanmadığını söylemedim, sadece bunun için tasarlanmamış gibi görünüyor, en azından herkesin erişebileceği harici sürüm. Bu Google mühendisinin yorumunu buradan
saidimu apale

9
Daha da önemlisi, Thrift'in yerleşik RPC desteği var. Protobuf şu anda üçüncü taraf kütüphanelere güveniyor, yani daha az göz, daha az test, daha az güvenilir kod.
Alec Thomas

2
Benim için ProtoBuf hakkında iyi bir nokta. Yalnızca serileştirmeniz gerekiyorsa, işe yaramaz kod eklemezsiniz. Ve gelecekte, RPC ile göndermeniz gerekiyorsa, sorun değil, işe yarayabilir. Ağ için Netty kullanıyorum ve Protobuf sadece mükemmel bir şekilde entegre edildi, bu yüzden sorun yok, test yok ve performansları en üst düzeye çıkarıyor.
Kikiwa

14
Protobuflar aslında RPC göz önünde bulundurularak tasarlandı. Google, bu bileşeni oldukça yakın zamanda açık kaynaklı hale getirdi
grpc.io

57
  • Protobuf serileştirilmiş nesneler Thrift'ten yaklaşık% 30 daha küçüktür.
  • Eğer protobuf nesneleri (oluşturmak, serialize, serisi kaldırılmaya) ile yapmak isteyebilirsiniz Çoğu eylemlerdir çok daha yavaş tutumluluk daha açtığınızda sürece option optimize_for = SPEED.
  • Tasarruf zengin veri yapılarına sahiptir (Harita, Küme)
  • Protobuf API daha temiz görünüyor, ancak oluşturulan sınıfların hepsi çok hoş olmayan iç sınıflar olarak paketlenmiştir.
  • Tasarruflu numaralandırmalar gerçek Java Numaralandırmalar değildir, yani sadece ints'tır. Protobuf'un gerçek Java sıralamaları vardır.

Farklılıklara daha yakından bakmak için bu açık kaynak projesindeki kaynak kodu farklarına bakın .


1
Hızlı öneri: Temel olarak kullanılan ikili olmayan başka bir biçim (xml veya json?) Varsa düzgün olurdu. Genel eğilimleri gösteren iyi testler olmadı - PB ve Thrift'in daha verimli olduğu varsayımı var, ancak eğer öyleyse ve ne kadar olursa, çoğunlukla açık bir soru.
StaxMan

4
0.02 saniye ?! Bu tür bir zaman yedekim yok
Chris S

1
Şimdi Thrift'in birden fazla protokolü (TCompactProtocol dahil) olduğuna göre, ilk merminin artık geçerli olmadığını düşünüyorum.
Janus Troelsen

13
Hız için optimize et seçeneği artık protokol arabellekleri için varsayılan ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem

5
"Optimize_for = speed" ayarlı% 30 daha küçük nesneler alıyor muyuz? Yoksa bu tehlikeye atılıyor mu?
Prashant Sharma

56

Dediğim gibi "Thrift vs Protokol arabellekleri" konu:

Atfen JSON karşılaştırma v Protobuf vs Thrift :

Ek olarak, bu çözümler için karar verebilecek birçok ilginç ek araç vardır. Protobuf için örnekler: Protobuf-wireshark , protobufeditor .


10
Şimdi bu tam bir daire. Aynı cevabı her zaman veya ikisine birden bağlayan üç (benzer) soruya gönderdiniz. Zelda oynuyor gibi hissediyorum ve bir işaret özledim.
ChrisR

+ ChrisR heh, nasıl olduğunu hatırlayamıyorum. Birkaç benzer soru olmasına rağmen, belki döngü yerine üç benzer yapı yapmalıyım. Bir gün ... Bu çok eski bir soru ve şimdi telefondan cevap veriyorum. Her neyse, yakalamak için teşekkürler!
Grzegorz Wierzowiecki

6
"Thrift iyi bir öğretici ile geliyor" - ne kadar komik. Bu şimdiye kadar gördüğüm en eksik öğretici. TSimpleServer'ın yanında bir şeyler yapmak istediğiniz anda orada sıkışıp
kalıyorsunuz


8

Protokol Tamponları daha kompakt bir temsile sahip gibi görünüyor, ancak bu sadece Thrift teknik incelemesini okumaktan aldığım bir izlenim. Kendi sözleriyle:

Koddaki basitlik ve netlik amacıyla bazı aşırı depolama optimizasyonlarına (yani, küçük tam sayıları ASCII'ye paketleme veya 7 bitlik bir devam biçimi kullanma) karar verdik. Bu değişiklikler, bunları gerektiren performans açısından kritik bir kullanım durumu ile karşılaştığımızda ve karşılaştığımızda kolayca yapılabilir.

Ayrıca, sadece benim izlenimim olabilir, ancak Protokol Tamponları, yapısal sürüm oluşturma konusunda bazı daha kalın soyutlamalara sahip gibi görünüyor. Thrift'in bazı sürüm oluşturma desteği var, ancak bunun gerçekleşmesi biraz çaba gerektiriyor.


1
Thrift'in olabildiğince kompakt olmadığını itiraf etmesi neden Protokol Tamponlarının olduğuna inanmanıza neden oluyor?
Michael Mior

1
Protokol tamponları, hem değerler hem de alan tanımlayıcıları için değişken uzunluklu tamsayı kodlaması kullanır. Bu nedenle, küçük bir değere sahip bir int alanı göndermenin en yaygın durumu, int16 ve int32 değil, iki bayt olacaktır.
poolie

"Protokol tamponları değişken uzunluklu tamsayı kodlaması kullanır" - TCompactProtocol
JensG


7

Henüz belirtilmeyen bir şey, hem bir pro hem de con (ve her ikisi için de aynı olabilir) ikili protokoller olmasıdır. Bu, daha kompakt bir temsile ve muhtemelen daha fazla performansa (artılara) izin verir, ancak daha az okunabilirlik (veya daha çok hata ayıklama) ile bir con.

Ayrıca, her ikisi de xml (ve belki de json) gibi standart biçimlerden daha az araç desteğine sahiptir.

(EDIT) Hem boyut hem de performans farklılıklarını ele alan ve diğer bazı biçimler (xml, json) için de sayılar içeren İlginç bir karşılaştırma .


3
XML'den çok daha fazla okunabilir bir metin temsiline bir protokol arabelleği çıkarmak önemsizdir: my_proto.DebugString (). Bir örnek için bkz code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric

Tabii ki, tüm ikili formatlar için ditto - ama onları olduğu gibi okunabilir yapmaz (telde hata ayıklama). Daha da kötüsü, protobuf için alan adlarını bilmek için şema tanımına ihtiyacınız vardır.
StaxMan

Thrift farklı, hatta kullanıcı tanımlı protokolleri destekler. İkili, kompakt, json veya geçen hafta icat ettiğiniz bir şeyi kullanabilirsiniz.
JensG

6

Ve wiki'ye göre Thrift çalışma zamanı Windows'ta çalışmaz.


5
Thrift'i Windows üzerinde başarıyla çalıştırıyorum. Github.com/aubonbeurre/thrift
Sergey Podobry

20
Resmi ana hat şubesinde artık Windows desteği var.
Janus Troelsen

5
@dalle - Alex P Thrift'e Boost iplik desteği ekledi. Şimdi Windows için varsayılan iş parçacığı. * NIX varsayılan olarak pthreads'dir. Ve Janus T'i onaylamak için Thrift artık Windows'u tamamen destekliyor.
pmont

21
Bu eski bir Bilgi. Thrift şu anda bir Windows üzerinde mükemmel bir şekilde çalışıyor.
JensG


4

Bu noktaların çoğunun Thrift'in çeşitli yöntemler (ikili, XML, vb.) Kullanarak verileri serileştirme yeteneğine sahip olan bir RPC çerçevesi olduğu temel gerçeğini kaçırdığını düşünüyorum.

Protokol Tamponları tamamen serileştirme için tasarlanmıştır, Thrift gibi bir çerçeve değildir.


3
RPC çerçevesi ile neyi kastediyorsunuz ve bunun protobuf'un gRPC'sinden farkı nedir?
marcelocra

gRPC protobuf ile birlikte paketlenmemiştir. 10 yıl sonra geliştirildi. Thrift, tam RPC çerçevesi ile birlikte gelir. Birlikte yapıldı.
Trilogy


0

Burada bazı mükemmel noktalar var ve birinin yolunun kesişmesi durumunda bir tane daha ekleyeceğim.

Thrift size thrift-binary ve thrift-compact (de) serileştirici arasında seçim yapma seçeneği sunar, thrift-binary mükemmel bir performansa ancak daha büyük paket boyutuna sahipken, thrift compact size iyi sıkıştırma sağlar, ancak daha fazla işlem gücüne ihtiyaç duyar. Bu kullanışlıdır, çünkü bu iki mod arasında her zaman bir kod satırını değiştirmek kadar kolay geçiş yapabilirsiniz (heck, hatta yapılandırılabilir hale getirin). Dolayısıyla, uygulamanızın paket boyutu veya işlem gücü için ne kadar optimize edilmesi gerektiğinden emin değilseniz, tasarruf ilginç bir seçim olabilir.

Not: thekvsTasarruflu ikili, tasarruflu kompakt ve protobuf da dahil olmak üzere birçok serileştiriciyi karşılaştıran bu mükemmel kıyaslama projesine bakın : https://github.com/thekvs/cpp-serializers

Not: YASBu seçeneği de veren başka bir serileştirici var, ancak şema olmadan yukarıdaki bağlantıya bakın.


0

Ayrıca, desteklenen tüm dillerin tasarruf veya protobuf ile tutarlı bir şekilde uyumlu olmadığına dikkat etmek de önemlidir. Bu noktada, altta yatan serileştirmeye ek olarak modüllerin uygulanmasıyla ilgilidir. Kullanmayı planladığınız dil için karşılaştırmaları kontrol etmeye özen gösterin.

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.