थ्रिफ्ट बनाम प्रोटोकॉल बफ़र्स का सबसे बड़ा अंतर?


286

Google के प्रोटोकॉल बफ़र्स के अपाचे थ्रिफ़्ट बनाम सबसे बड़े पेशेवरों और विपक्षों में क्या हैं ?


4
एक साइड नोट के रूप में, मार्क
ग्रेवेल

5
यह प्रश्न और निम्नलिखित कुछ उत्तर लगभग 6 वर्ष पुराने हैं। शायद तब से बहुत कुछ बदल गया है।
एलिकएल्ज़िन-किलाका

जवाबों:


159

वे दोनों समान सुविधाओं की पेशकश करते हैं; हालाँकि, कुछ अंतर हैं:

  • थ्रिफ़्ट का समर्थन 'अपवाद'
  • प्रोटोकॉल बफ़र्स के पास बहुत बेहतर दस्तावेज़ / उदाहरण हैं
  • थ्रिफ्ट में एक बेसिन Setप्रकार होता है
  • प्रोटोकॉल बफ़र्स "एक्सटेंशन" की अनुमति देते हैं - आप अतिरिक्त फ़ील्ड को जोड़ने के लिए एक बाहरी प्रोटोको बढ़ा सकते हैं, जबकि अभी भी बाहरी कोड को मूल्यों पर काम करने की अनुमति देते हैं। थ्रिफ्ट में ऐसा करने का कोई तरीका नहीं है
  • मुझे प्रोटोकॉल बफ़र्स पढ़ने में बहुत आसान लगते हैं

मूल रूप से, वे काफी समकक्ष हैं (प्रोटोकॉल बफर के साथ जो मैंने पढ़ा है उससे थोड़ा अधिक कुशल)।


16
यह प्रस्तुति उन्हें 2013 स्लाइडशेयर के
BAR


1
कुछ भाषाओं के लिए आप एक्सटेंशन जोड़ सकते हैं। उदाहरण के लिए, थ्रिफ्ट C # के लिए आंशिक कक्षाएं उत्पन्न करता है जो विस्तार करना आसान है। हालाँकि, यह सामान्य नियम नहीं है, यह सच है।
जेन्स जी 27'15

grpc 1.0 (proto3) समर्थन mapभी
KindDragon

85

एक और महत्वपूर्ण अंतर डिफ़ॉल्ट रूप से समर्थित भाषाएं हैं।

  • प्रोटोकॉल बफ़र्स: जावा, एंड्रॉइड जावा, सी ++, पायथन, रूबी, सी #, गो, ऑब्जेक्टिव-सी, नोड्स .js
  • थ्रिफ्ट: जावा, सी ++, पायथन, रूबी, सी #, गो, ऑब्जेक्टिव-सी, जावास्क्रिप्ट, नोड्स.जेएस, एर्लांग, पीएचपी, पर्ल, हास्केल, स्मॉलटॉक, ओकेमेल, डेल्फी, डी, हैक्स

दोनों को अन्य प्लेटफार्मों पर बढ़ाया जा सकता है, लेकिन ये ऐसी भाषाएं हैं जो आउट-ऑफ-द-बॉक्स उपलब्ध हैं।


16
प्रोटोबॉफ़ में उत्कृष्ट रूबी समर्थन github.com/macks/ruby-protobuf और code.google.com/p/ruby-protobuf है । मैं सी # (3.5) और रूबी से सी # का उपयोग कर रहा हूँ, सी # डेटा को क्रमबद्ध कर रहा है, और जब आवश्यकता होती है, रूबी deserializing और कार्य पर काम कर रहा है।
ब्रायन बालियाचे

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 को सूचीबद्ध करता है। सोचा कि ये सभी तृतीय-पक्ष कार्यान्वयन हैं।
इगोर गेटिस

आप सीधे प्रोटोबुफ़ सी ++ फ़ाइलों को उद्देश्य सी में उपयोग कर सकते हैं (IOS और OS X दोनों के लिए) इस qn की जाँच करें
तुषार कूल

मैं देख रहा हूं कि कोड. google.com/p/protobuf-net को अक्सर C # के लिए एक प्रोटोबोफ पोर्ट के रूप में उल्लेख किया जाता है, लेकिन यह पूरी तरह से सच नहीं है। प्रोटोबॉफ़ और थ्रिफ्ट की एक महत्वपूर्ण विशेषता बाहरी संरचना की परिभाषा है, इसलिए समान परिभाषा का उपयोग विभिन्न भाषाओं द्वारा किया जा सकता है। प्रोटोबॉफ-नेट इस सुविधा का समर्थन नहीं करता है क्योंकि यह सी # कोड के अंदर संरचना परिभाषा को एम्बेड करता है।
एंड्री टाइक्लोको

@AndyT: यह बहस का मुद्दा है - यह इस बात पर निर्भर करता है कि क्या यह एक फायदा है कि संरचना की परिभाषा उन सभी भाषाओं के लिए बाहरी है जिन्हें आप समर्थन करना चाहते हैं। प्रोटोबुफ़-नेट के साथ आप अपनी डेटा संरचना को C # में परिभाषित करते हैं, और उससे .proto फ़ाइल उत्पन्न करते हैं, जो तब अन्य भाषाओं में समर्थन बनाने के लिए उपयोग की जा सकती है। मैं इसे एक लाभ मानता हूं, क्योंकि मैं बहुत ही C # -centric हूं और एक बड़े मौजूदा। नेट एप्लिकेशन को एंड्रॉइड / जावा को एकीकृत करने की प्रक्रिया में हूं। इसलिए मैं अपनी सी # कक्षाओं को निश्चित संरचना परिभाषाओं पर विचार करना जारी रखना चाहता हूं।
RenniePet

73

आरपीसी एक और महत्वपूर्ण अंतर है। थ्रिफ्ट आरपीसी क्लाइंट और सर्वर को लागू करने के लिए कोड उत्पन्न करता है प्रोटोकॉल प्रोटोकॉल बफ़र ज्यादातर अकेले डेटा-इंटरचेंज प्रारूप के रूप में डिज़ाइन किए गए लगते हैं।


9
यह सच नहीं है। प्रोटोकॉल बफ़र्स एक RPC सेवा एपीआई को परिभाषित करते हैं और पासिंग संदेश को लागू करने के लिए कुछ लाइब्रेरी उपलब्ध हैं।
स्टीफन

7
मैंने यह नहीं कहा कि प्रोटोबॉफ़ में आरपीसी परिभाषित नहीं है, बस यह नहीं लगता है कि इसके लिए डिज़ाइन किया गया है, कम से कम बाहरी रिलीज़ नहीं है जो हर किसी के पास है। Google इंजीनियर की यह टिप्पणी यहाँ
कहा जाता है कि

9
इससे भी महत्वपूर्ण बात यह है कि थ्रिफ्ट में आरपीसी सपोर्ट है। प्रोटोबॉफ वर्तमान में थर्ड-पार्टी लाइब्रेरी पर निर्भर करता है, जिसका अर्थ है कम आँखें, कम परीक्षण, कम विश्वसनीय कोड।
एलेक थॉमस

2
मेरे लिए, यह प्रोटॉफ के बारे में एक अच्छा बिंदु है। यदि आपको केवल अनुक्रमित करने की आवश्यकता है, तो आप बेकार कोड नहीं जोड़ेंगे। और अगर भविष्य में, आपको इसे आरपीसी द्वारा भेजने की आवश्यकता है, तो कोई समस्या नहीं है, यह काम कर सकता है। मैं नेटवर्क के लिए Netty का उपयोग करता हूं, और Protobuf अभी पूरी तरह से एकीकृत है, इसलिए कोई समस्या नहीं, कोई परीक्षण नहीं, और अधिकतम प्रदर्शन।
किकिवा

14
प्रोटोबुफ़ वास्तव में, आरपीसी को ध्यान में रखकर बनाए गए थे। Google ने उस घटक को अभी हाल ही में खुला - grpc.io
andybons

57
  • प्रोटोबॉफ़ अनुक्रमित वस्तुएं थ्रिफ्ट की तुलना में लगभग 30% छोटी हैं।
  • जब तक आप चालू नहीं करते हैं, तो अधिकांश क्रियाएं आप प्रोटोबॉफ़ ऑब्जेक्ट्स के साथ करना चाहते हैं (बनाएं, सीरियलाइज़, डिस्क्राइलाइज़) बहुत धीमी हैं option optimize_for = SPEED
  • थ्रिफ़्ट में समृद्ध डेटा संरचनाएँ हैं (मानचित्र, सेट)
  • प्रोटोबॉफ एपीआई क्लीनर दिखता है, हालांकि उत्पन्न कक्षाएं सभी आंतरिक कक्षाओं के रूप में पैक की जाती हैं जो इतना अच्छा नहीं है।
  • थ्रिफ्ट एंफम्स असली जावा एनम नहीं हैं, यानी वे सिर्फ इनट्स हैं। Protobuf में असली Java enums हैं।

मतभेदों पर करीब से देखने के लिए, इस खुले स्रोत परियोजना के स्रोत कोड की जांच करें ।


1
त्वरित सुझाव: यदि आधारभूत के रूप में इस्तेमाल किया गया एक और गैर-बाइनरी प्रारूप (xml या json?) है तो यह साफ-सुथरा होगा। सामान्य रुझान दिखाने वाले अच्छे परीक्षण नहीं हुए हैं - धारणा यह है कि पीबी और थ्रिफ्ट अधिक कुशल हैं, लेकिन यदि और यदि ऐसा है तो ज्यादातर एक खुला प्रश्न है।
स्टैक्मैन मैन

4
0.02 सेकंड ?! मेरे पास उस तरह का समय नहीं है
क्रिस एस

1
अब जबकि थ्रिफ्ट में कई प्रोटोकॉल हैं (एक TCompactProtocol सहित), मुझे लगता है कि पहली गोली अब लागू नहीं होती है।
Janus Troelsen

13
गति विकल्प के लिए अनुकूलन अब प्रोटोकॉल बफ़र्स ( code.google.com/apis/protocolbuffers/docs/proto.html ) के लिए डिफ़ॉल्ट है
Willem

5
क्या हमें "optim_for = speed" सेट के साथ 30% छोटी वस्तुएं मिलती हैं? या कि समझौता किया है?
प्रशांत शर्मा

56

जैसा कि मैंने कहा है "थ्रिफ्ट बनाम प्रोटोकॉल बफ़र्स" विषय:

थ्रिफ्ट बनाम प्रोटोबुफ़ बनाम जैसन तुलना का उल्लेख :

इसके अतिरिक्त, उन समाधानों के लिए बहुत सारे दिलचस्प अतिरिक्त उपकरण उपलब्ध हैं, जो तय कर सकते हैं। यहाँ प्रोटोबुफ़ के लिए उदाहरण हैं: प्रोटोबॉफ़-तारशर्क , प्रोटोबुफ़ेडिटर


10
अब यह एक पूर्ण चक्र है। आपने तीन (समान) सवालों के बिल्कुल समान उत्तर पोस्ट किए हैं जो हमेशा या तो वापस लिंक करते हैं। मुझे लगता है कि मैं ज़ेल्डा खेल रहा हूं और एक संकेत याद किया।
क्रिस

+ क्रिस क्रिस, मुझे याद नहीं है कि यह कैसे हुआ। हालाँकि कुछ ऐसे ही सवाल थे, शायद मुझे चक्र के बजाय तीन तरह की संरचना करनी चाहिए। एक दिन ... यह बहुत पुराना सवाल है और अब मैं फोन से जवाब दे रहा हूं। किसी भी तरह, पकड़ने के लिए धन्यवाद!
ग्रेज़गोरज़ वियर्ज़ोवेकी

6
"थ्रिफ्ट एक अच्छे ट्यूटोरियल के साथ आता है" - कितना मज़ेदार है। इसका सबसे अधूरा ट्यूटोरियल मैंने कभी देखा है। जैसे ही आप TSimpleServer के पास कुछ करना चाहते हैं आप वहां फंस जाते हैं
Marian Klühspies

थ्रिफ़्ट में भी
विंडसर

8

प्रोटोकॉल बफ़र्स को अधिक कॉम्पैक्ट प्रतिनिधित्व लगता है, लेकिन यह केवल एक धारणा है जो मुझे थ्रिफ्ट व्हाइटपेपर पढ़ने से मिलती है। उनके अपने शब्दों में:

हमने कोड में सादगी और स्पष्टता के लिए कुछ चरम भंडारण अनुकूलन (यानी ASCII में छोटे पूर्णांक पैक करना या 7-बिट निरंतरता प्रारूप का उपयोग करना) के खिलाफ निर्णय लिया। ये परिवर्तन आसानी से किए जा सकते हैं यदि हम एक प्रदर्शन-महत्वपूर्ण उपयोग मामले का सामना करते हैं जो उनकी मांग करता है।

इसके अलावा, यह सिर्फ मेरी धारणा हो सकती है, लेकिन प्रोटोकॉल बफ़र्स में स्ट्रक्चर वर्जनिंग के आस-पास कुछ मोटे एब्सट्रैक्ट होते हैं। थ्रिफ्ट में कुछ वर्जनिंग सपोर्ट है, लेकिन इसे बनाने में थोड़ा सा प्रयास करना पड़ता है।


1
तथ्य यह है कि थ्रिफ्ट के रूप में संभव के रूप में कॉम्पैक्ट नहीं होने के लिए मानते हैं कि आप प्रोटोकॉल बफ़र्स पर विश्वास कर रहे हैं?
माइकल मोइर

1
प्रोटोकॉल बफ़र चर लंबाई पूर्णांक कोडिंग का उपयोग करते हैं, दोनों मान और क्षेत्र पहचानकर्ताओं के लिए। तो एक छोटे मूल्य के साथ एक अंतर क्षेत्र भेजने का बहुत ही सामान्य मामला दो बाइट्स होगा, एक int16 और int32 नहीं।
पूली

"प्रोटोकॉल बफ़र्स चर लंबाई पूर्णांक कोडिंग का उपयोग करते हैं" - तो TCompactProtocol
JensG

8

मैं एक पाठ आधारित प्रोटोकॉल के साथ बेहतर प्रदर्शन प्राप्त करने में सक्षम था जैसे कि अजगर पर प्रोटोबफ की तुलना में। हालांकि, कोई प्रकार की जाँच या अन्य फैंसी utf8 रूपांतरण, आदि ... जो प्रोटोबफ प्रदान नहीं करता है।

तो, यदि क्रमांकन / deserialization आप सभी की जरूरत है, तो आप शायद कुछ और का उपयोग कर सकते हैं।

http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html


7

एक स्पष्ट बात जो अभी तक उल्लेखित नहीं है वह यह है कि दोनों एक समर्थक या चोर हो सकते हैं (और दोनों के लिए समान है) यह है कि वे द्विआधारी प्रोटोकॉल हैं। यह अधिक कॉम्पैक्ट प्रतिनिधित्व और संभवतः अधिक प्रदर्शन (पेशेवरों) के लिए अनुमति देता है, लेकिन कम पठनीयता के साथ (या बल्कि, डिबगैबिलिटी), एक कोन।

इसके अलावा, दोनों के पास xml (और शायद json) जैसे मानक प्रारूपों की तुलना में थोड़ा कम टूल सपोर्ट है।

(EDIT) यहाँ एक दिलचस्प तुलना है जो आकार और प्रदर्शन अंतर दोनों से निपटती है, और इसमें कुछ अन्य स्वरूपों (xml, json) के लिए नंबर भी शामिल हैं।


3
यह एक प्रोटोकॉल बफर को एक पाठ प्रतिनिधित्व के लिए आउटपुट करने के लिए तुच्छ है जो XML की तुलना में बहुत अधिक मानव-पठनीय है: my_proto.DebugString ()। एक उदाहरण के लिए, code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric

बेशक, सभी द्विआधारी प्रारूपों के लिए डिट्टो - लेकिन यह उन्हें पढ़ने योग्य नहीं बनाता है जैसा कि (तार पर डिबग) है। इससे भी बदतर, प्रोटोबुफ़ के लिए, आपको वास्तव में फ़ील्ड नामों को जानने के लिए स्कीमा डीई की आवश्यकता होती है।
StaxMan

थ्रिफ्ट अलग, यहां तक ​​कि उपयोगकर्ता-परिभाषित, प्रोटोकॉल का समर्थन करता है। आप द्विआधारी, कॉम्पैक्ट, जसन या आपके द्वारा पिछले सप्ताह आविष्कार की गई किसी चीज़ का उपयोग कर सकते हैं।
जेन्सजी

6

और विकी के अनुसार थ्रिफ्ट रनटाइम विंडोज पर नहीं चलता है।


5
मैं सफलतापूर्वक विंडोज पर थ्रिफ्ट चलाता हूं। उपयोग खिड़कियों पर कांटा github.com/aubonbeurre/thrift
सेर्गेई Podobry

20
आधिकारिक मेनलाइन शाखा में अब विंडोज का भी समर्थन है।
Janus Troelsen

5
@ डेली - एलेक्स पी ने थ्रिफ्ट में बूस्ट थ्रेड सपोर्ट को जोड़ा। यह अब विंडोज के लिए डिफॉल्ट थ्रेडिंग है। * एनआईएक्स pthreads करने के लिए चूक। और जानूस टी की पुष्टि करने के लिए, थ्रिफ्ट अब पूरी तरह से विंडोज का समर्थन करता है।
दोपहर

21
यह पुरानी जानकारी है। थ्रिफ्ट अब पूरी तरह से विंडोज पर लूज टाइम के लिए चलता है।
जेन्स जी २G

6

ProtocolBuffers तेजी है।
यहाँ एक अच्छा बेंचमार्क है:
http://code.google.com/p/thrift-protobuf-compare/wiki/Bibchmarking

आप एवरो में भी देखना चाह सकते हैं, क्योंकि एवरो और भी तेज है।
Microsoft के पास यहाँ एक पैकेज है:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

वैसे, मैंने जो सबसे तेज़ देखा है वह है Cap'nProto ; मार्क ग्रेवेल
के गिथब-रिपॉजिटरी में एसी # कार्यान्वयन पाया जा सकता है ।


4

मुझे लगता है कि इनमें से अधिकांश बिंदुओं ने मूल तथ्य को याद किया है कि थ्रिफ्ट एक आरपीसी फ्रेमवर्क है, जो विभिन्न तरीकों (बाइनरी, एक्सएमएल, आदि) का उपयोग करके डेटा को क्रमबद्ध करने की क्षमता रखता है।

प्रोटोकॉल बफ़र्स को विशुद्ध रूप से क्रमांकन के लिए डिज़ाइन किया गया है, यह थ्रिफ्ट जैसी रूपरेखा नहीं है।


3
आरपीसी ढांचे से आपका क्या तात्पर्य है और यह प्रोटोबॉफ के जीआरपीसी से कैसे अलग है ?
मार्सेलोकेरा

gRPC को प्रोटोबोफ़ के साथ पैक नहीं किया जाता है। इसे 10 साल बाद विकसित किया गया था। थ्रिफ्ट पूर्ण आरपीसी ढांचे के साथ पैक किया गया है। इसे एक साथ बनाया गया था।
त्रयी

3

एक के लिए, प्रोटोबॉफ़ एक पूर्ण आरपीसी कार्यान्वयन नहीं है। इसके साथ जाने के लिए gRPC जैसी किसी चीज़ की आवश्यकता होती है।

थ्रिफ्ट की तुलना में gPRC बहुत धीमा है:

http://szelei.me/rpc-benchmark-part1/


0

यहाँ कुछ उत्कृष्ट बिंदु हैं और मैं यहाँ किसी के पथ को पार करने की स्थिति में एक और जोड़ने जा रहा हूँ।

थ्रिफ़्ट आपको थ्रिफ्ट-बाइनरी और थ्रिफ्ट-कॉम्पेक्ट (डी) सीरियलाइज़र के बीच चयन करने का विकल्प देता है, थ्रिफ़्ट-बाइनरी में एक उत्कृष्ट प्रदर्शन लेकिन बड़ा पैकेट आकार होगा, जबकि थ्रिफ़्ट-कॉम्पैक्ट आपको अच्छा संपीड़न देगा लेकिन अधिक प्रसंस्करण शक्ति की आवश्यकता है। यह आसान है क्योंकि आप हमेशा इन दो मोड के बीच स्विच कर सकते हैं जितनी आसानी से कोड की एक पंक्ति को बदल सकते हैं (हेक, यहां तक ​​कि इसे कॉन्फ़िगर करने योग्य बनाते हैं)। इसलिए यदि आप सुनिश्चित नहीं हैं कि पैकेट आकार या प्रसंस्करण शक्ति के लिए आपके आवेदन को कितना अनुकूलित किया जाना चाहिए, तो थ्रिफ्ट एक दिलचस्प विकल्प हो सकता है।

पुनश्च: इस उत्कृष्ट बेंचमार्क प्रोजेक्ट को देखें thekvs, जिसमें थ्रिफ्ट-बाइनरी, थ्रिफ्ट-कॉम्पैक्ट, और प्रोटोबुफ़ सहित कई धारावाहिकों की तुलना की जाती है: https://github.com/thekvs/cpp-serializers

पुनश्च: एक और धारावाहिक नाम दिया गया है YASजो इस विकल्प को भी देता है लेकिन यह स्कीमा-कम है ऊपर दिए गए लिंक को देखें।


0

यह भी ध्यान रखना महत्वपूर्ण है कि सभी समर्थित भाषाएं लगातार थ्रिफ्ट या प्रोटॉब के साथ कम्पेयर नहीं करती हैं। इस बिंदु पर यह अंतर्निहित क्रमांकन के अलावा मॉड्यूल के कार्यान्वयन की बात है। आप जिस भी भाषा का उपयोग करने की योजना बना रहे हैं, उसके लिए बेंचमार्क की जाँच करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.