Google के प्रोटोकॉल बफ़र्स के अपाचे थ्रिफ़्ट बनाम सबसे बड़े पेशेवरों और विपक्षों में क्या हैं ?
Google के प्रोटोकॉल बफ़र्स के अपाचे थ्रिफ़्ट बनाम सबसे बड़े पेशेवरों और विपक्षों में क्या हैं ?
जवाबों:
वे दोनों समान सुविधाओं की पेशकश करते हैं; हालाँकि, कुछ अंतर हैं:
Set
प्रकार होता हैमूल रूप से, वे काफी समकक्ष हैं (प्रोटोकॉल बफर के साथ जो मैंने पढ़ा है उससे थोड़ा अधिक कुशल)।
map
भी
एक और महत्वपूर्ण अंतर डिफ़ॉल्ट रूप से समर्थित भाषाएं हैं।
दोनों को अन्य प्लेटफार्मों पर बढ़ाया जा सकता है, लेकिन ये ऐसी भाषाएं हैं जो आउट-ऑफ-द-बॉक्स उपलब्ध हैं।
आरपीसी एक और महत्वपूर्ण अंतर है। थ्रिफ्ट आरपीसी क्लाइंट और सर्वर को लागू करने के लिए कोड उत्पन्न करता है प्रोटोकॉल प्रोटोकॉल बफ़र ज्यादातर अकेले डेटा-इंटरचेंज प्रारूप के रूप में डिज़ाइन किए गए लगते हैं।
option optimize_for = SPEED
।मतभेदों पर करीब से देखने के लिए, इस खुले स्रोत परियोजना के स्रोत कोड की जांच करें ।
जैसा कि मैंने कहा है "थ्रिफ्ट बनाम प्रोटोकॉल बफ़र्स" विषय:
थ्रिफ्ट बनाम प्रोटोबुफ़ बनाम जैसन तुलना का उल्लेख :
इसके अतिरिक्त, उन समाधानों के लिए बहुत सारे दिलचस्प अतिरिक्त उपकरण उपलब्ध हैं, जो तय कर सकते हैं। यहाँ प्रोटोबुफ़ के लिए उदाहरण हैं: प्रोटोबॉफ़-तारशर्क , प्रोटोबुफ़ेडिटर ।
प्रोटोकॉल बफ़र्स को अधिक कॉम्पैक्ट प्रतिनिधित्व लगता है, लेकिन यह केवल एक धारणा है जो मुझे थ्रिफ्ट व्हाइटपेपर पढ़ने से मिलती है। उनके अपने शब्दों में:
हमने कोड में सादगी और स्पष्टता के लिए कुछ चरम भंडारण अनुकूलन (यानी ASCII में छोटे पूर्णांक पैक करना या 7-बिट निरंतरता प्रारूप का उपयोग करना) के खिलाफ निर्णय लिया। ये परिवर्तन आसानी से किए जा सकते हैं यदि हम एक प्रदर्शन-महत्वपूर्ण उपयोग मामले का सामना करते हैं जो उनकी मांग करता है।
इसके अलावा, यह सिर्फ मेरी धारणा हो सकती है, लेकिन प्रोटोकॉल बफ़र्स में स्ट्रक्चर वर्जनिंग के आस-पास कुछ मोटे एब्सट्रैक्ट होते हैं। थ्रिफ्ट में कुछ वर्जनिंग सपोर्ट है, लेकिन इसे बनाने में थोड़ा सा प्रयास करना पड़ता है।
मैं एक पाठ आधारित प्रोटोकॉल के साथ बेहतर प्रदर्शन प्राप्त करने में सक्षम था जैसे कि अजगर पर प्रोटोबफ की तुलना में। हालांकि, कोई प्रकार की जाँच या अन्य फैंसी utf8 रूपांतरण, आदि ... जो प्रोटोबफ प्रदान नहीं करता है।
तो, यदि क्रमांकन / deserialization आप सभी की जरूरत है, तो आप शायद कुछ और का उपयोग कर सकते हैं।
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
एक स्पष्ट बात जो अभी तक उल्लेखित नहीं है वह यह है कि दोनों एक समर्थक या चोर हो सकते हैं (और दोनों के लिए समान है) यह है कि वे द्विआधारी प्रोटोकॉल हैं। यह अधिक कॉम्पैक्ट प्रतिनिधित्व और संभवतः अधिक प्रदर्शन (पेशेवरों) के लिए अनुमति देता है, लेकिन कम पठनीयता के साथ (या बल्कि, डिबगैबिलिटी), एक कोन।
इसके अलावा, दोनों के पास xml (और शायद json) जैसे मानक प्रारूपों की तुलना में थोड़ा कम टूल सपोर्ट है।
(EDIT) यहाँ एक दिलचस्प तुलना है जो आकार और प्रदर्शन अंतर दोनों से निपटती है, और इसमें कुछ अन्य स्वरूपों (xml, json) के लिए नंबर भी शामिल हैं।
और विकी के अनुसार थ्रिफ्ट रनटाइम विंडोज पर नहीं चलता है।
ProtocolBuffers तेजी है।
यहाँ एक अच्छा बेंचमार्क है:
http://code.google.com/p/thrift-protobuf-compare/wiki/Bibchmarking
आप एवरो में भी देखना चाह सकते हैं, क्योंकि एवरो और भी तेज है।
Microsoft के पास यहाँ एक पैकेज है:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro
वैसे, मैंने जो सबसे तेज़ देखा है वह है Cap'nProto ; मार्क ग्रेवेल
के गिथब-रिपॉजिटरी में एसी # कार्यान्वयन पाया जा सकता है ।
मुझे लगता है कि इनमें से अधिकांश बिंदुओं ने मूल तथ्य को याद किया है कि थ्रिफ्ट एक आरपीसी फ्रेमवर्क है, जो विभिन्न तरीकों (बाइनरी, एक्सएमएल, आदि) का उपयोग करके डेटा को क्रमबद्ध करने की क्षमता रखता है।
प्रोटोकॉल बफ़र्स को विशुद्ध रूप से क्रमांकन के लिए डिज़ाइन किया गया है, यह थ्रिफ्ट जैसी रूपरेखा नहीं है।
एक के लिए, प्रोटोबॉफ़ एक पूर्ण आरपीसी कार्यान्वयन नहीं है। इसके साथ जाने के लिए gRPC जैसी किसी चीज़ की आवश्यकता होती है।
थ्रिफ्ट की तुलना में gPRC बहुत धीमा है:
यहाँ कुछ उत्कृष्ट बिंदु हैं और मैं यहाँ किसी के पथ को पार करने की स्थिति में एक और जोड़ने जा रहा हूँ।
थ्रिफ़्ट आपको थ्रिफ्ट-बाइनरी और थ्रिफ्ट-कॉम्पेक्ट (डी) सीरियलाइज़र के बीच चयन करने का विकल्प देता है, थ्रिफ़्ट-बाइनरी में एक उत्कृष्ट प्रदर्शन लेकिन बड़ा पैकेट आकार होगा, जबकि थ्रिफ़्ट-कॉम्पैक्ट आपको अच्छा संपीड़न देगा लेकिन अधिक प्रसंस्करण शक्ति की आवश्यकता है। यह आसान है क्योंकि आप हमेशा इन दो मोड के बीच स्विच कर सकते हैं जितनी आसानी से कोड की एक पंक्ति को बदल सकते हैं (हेक, यहां तक कि इसे कॉन्फ़िगर करने योग्य बनाते हैं)। इसलिए यदि आप सुनिश्चित नहीं हैं कि पैकेट आकार या प्रसंस्करण शक्ति के लिए आपके आवेदन को कितना अनुकूलित किया जाना चाहिए, तो थ्रिफ्ट एक दिलचस्प विकल्प हो सकता है।
पुनश्च: इस उत्कृष्ट बेंचमार्क प्रोजेक्ट को देखें thekvs
, जिसमें थ्रिफ्ट-बाइनरी, थ्रिफ्ट-कॉम्पैक्ट, और प्रोटोबुफ़ सहित कई धारावाहिकों की तुलना की जाती है: https://github.com/thekvs/cpp-serializers
पुनश्च: एक और धारावाहिक नाम दिया गया है YAS
जो इस विकल्प को भी देता है लेकिन यह स्कीमा-कम है ऊपर दिए गए लिंक को देखें।