वितरित सिस्टम और माइक्रोसर्विस में, मैसेज ब्रोकर्स आवश्यक हैं। वे अतुल्यकालिक संचार को सक्षम करते हैं, सेवाओं को अलग करते हैं, और विश्वसनीयता और मापनीयता को बढ़ाते हैं। आधुनिक वास्तुकला मैसेज ब्रोकर्स पर बहुत अधिक निर्भर करती है, जिससे वे कई डिज़ाइन पैटर्न में एक महत्वपूर्ण घटक बन जाते हैं।
काफ़्का और रैबिटएमक्यू दो सबसे लोकप्रिय मैसेज ब्रोकर हैं। वे विश्वसनीय, कुशल और अनुकूलनीय होने के लिए जाने जाते हैं, साथ ही उनके पास बेहतरीन दस्तावेज़ीकरण, समर्थन और समुदाय भी हैं।
रैबिटएमक्यू एक मुफ़्त और ओपन-सोर्स समाधान है, जिसे अपाचे लाइसेंस 2.0 और मोज़िला पब्लिक लाइसेंस 2 के तहत दोहरे लाइसेंस प्राप्त हैं। यह आपको ज़रूरत के हिसाब से इसका इस्तेमाल करने और इसे संशोधित करने की अनुमति देता है। यह एक शुद्ध संदेश ब्रोकर के रूप में कार्य करता है, कई प्रोटोकॉल का समर्थन करता है और अतिरिक्त सुविधाएँ प्रदान करता है।
अपाचे 2.0 लाइसेंस के तहत ओपन-सोर्स काफ़्का सिर्फ़ एक मैसेज ब्रोकर से कहीं ज़्यादा है; यह एक वितरित इवेंट स्ट्रीमिंग प्लेटफ़ॉर्म है। यह काफ़्का स्ट्रीम्स सहित उन्नत सुविधाएँ प्रदान करता है।
रैबिटएमक्यू और काफ्का की तुलना करते समय, कोई "बेहतर" समाधान नहीं है; यह आपके आर्किटेक्चर और उद्देश्यों के लिए सबसे उपयुक्त समाधान खोजने के बारे में है।
यह लेख आपको मुख्य विशेषताओं और विशेषताओं के बारे में बताएगा, दोनों की सीधे तुलना करेगा। इसका उद्देश्य काफ़्का और रैबिटएमक्यू के बीच अंतर की व्यापक समझ प्रदान करना है, जिससे आपको अपनी विशिष्ट समस्या और आवश्यकताओं के आधार पर सूचित विकल्प बनाने में सहायता मिलेगी।
प्रोटोकॉल समर्थन
RabbitMQ विभिन्न प्रोटोकॉल का समर्थन करता है जैसे:
- MQTT (MQ टेलीमेट्री ट्रांसपोर्ट) सीमित बैंडविड्थ और उच्च-विलंबता नेटवर्क के लिए एक हल्का प्रोटोकॉल है, जैसे कि इंटरनेट ऑफ़ थिंग्स (IoT) में। शुरुआत में तेल पाइपलाइनों की निगरानी के लिए बनाया गया, अब इसे पब-सब मैसेजिंग प्रोटोकॉल के रूप में व्यापक रूप से उपयोग किया जाता है।
- STOMP (सिंपल टेक्स्ट ओरिएंटेड मैसेजिंग प्रोटोकॉल) मैसेजिंग एकीकरण के लिए एक सरल, हल्का टेक्स्ट-आधारित प्रोटोकॉल है, जो वेबसॉकेट और वेब पर उपयोग के लिए उपयुक्त है।
- AMQP (एडवांस्ड मैसेज क्यूइंग प्रोटोकॉल) RabbitMQ के लिए प्राथमिक प्रोटोकॉल है, जिसमें विभिन्न रूटिंग विकल्पों का विवरण दिया गया है। हालाँकि RabbitMQ प्लगइन्स के माध्यम से अन्य प्रोटोकॉल का समर्थन कर सकता है, AMQP इसका मुख्य प्रोटोकॉल है।
दूसरी ओर, काफ़्का अपने बाइनरी टीसीपी-आधारित प्रोटोकॉल का उपयोग करता है जो उच्च थ्रूपुट के लिए अनुकूलित है और "संदेश सेट" अमूर्तता पर निर्भर करता है। यह अमूर्तता नेटवर्क अनुरोधों को संदेशों को एक साथ समूहित करने की अनुमति देती है, जिससे व्यक्तिगत संदेशों के बजाय बैच भेजकर नेटवर्क राउंड-ट्रिप के ओवरहेड को कम किया जा सकता है। काफ़्का का कस्टम प्रोटोकॉल उच्च-लोड परिदृश्यों के लिए विकास और अनुकूलन में लचीलापन सक्षम बनाता है।
हालाँकि, कस्टम प्रोटोकॉल में कमियाँ भी हैं। यह काफ़्का को अन्य मैसेज ब्रोकर्स से अलग करता है, जिससे इंटरऑपरेबिलिटी की कमी होती है। रैबिटएमक्यू के विपरीत, जो किसी भी एएमक्यूपी क्लाइंट के साथ संगत है, काफ़्का को काफ़्का क्लाइंट का उपयोग करने की आवश्यकता होती है। फिर भी, काफ़्का की लोकप्रियता और सामुदायिक प्रयासों के कारण, काफ़्का क्लाइंट कई प्रोग्रामिंग भाषाओं के लिए उपलब्ध हैं।
मार्ग
रैबिटएमक्यू और काफ्का में रूटिंग दृष्टिकोण काफी भिन्न है।
रैबिटएमक्यू रूटिंग
RabbitMQ रूटिंग के मुख्य घटक:
- निर्माता. एक अनुप्रयोग जो RabbitMQ को संदेश उत्पन्न करता है और भेजता है।
- एक्सचेंज. निर्माता से संदेश प्राप्त करता है और उन्हें एक या अधिक कतारों में भेजता है।
- कतार. संदेश संग्रहीत करता है.
- उपभोक्ता। एक ऐसा अनुप्रयोग जो कतार की सदस्यता लेता है और उससे संदेश प्राप्त करता है। RabbitMQ उपभोक्ता को संदेश भेजता है , और प्रत्येक उपभोक्ता को केवल एक कतार से संदेश मिलते हैं।
एक्सचेंजों पर विस्तार से चर्चा करने से पहले हमें दो और अवधारणाओं को स्पष्ट करना चाहिए:
- बाइंडिंग। एक नियम बताता है कि एक्सचेंज से क्यू तक संदेशों को कैसे रूट किया जाए। आम तौर पर, एक उपभोक्ता क्यू बनाते समय उसे किसी विशिष्ट एक्सचेंज से बांधता है।
- रूटिंग कुंजी। RabbitMQ में, निर्माता सीधे संदेश के लिए कतार निर्दिष्ट नहीं कर सकता। एक्सचेंज निर्माता द्वारा प्रदान की गई रूटिंग कुंजी के आधार पर संदेशों को रूट करता है, जिसमें डॉट्स द्वारा अलग किए गए एक या अधिक स्ट्रिंग होते हैं।
एक्सचेंज के चार प्रकार हैं:
- डिफ़ॉल्ट. रूटिंग कुंजी से कतार नाम का उपयोग करके संदेशों को सीधे कतार में रूट करता है.
- फैनआउट. रूटिंग कुंजी को अनदेखा करते हुए सभी बाउंड क्यूज़ को संदेश प्रसारित करता है.
- प्रत्यक्ष. रूटिंग कुंजी और कतार द्वारा प्रदान की गई बाइंडिंग कुंजी के बीच सटीक मिलान के आधार पर कतारों में संदेशों को रूट करता है।
- विषय. रूटिंग कुंजी के पैटर्न मिलान के आधार पर जटिल रूटिंग नियमों की अनुमति देता है, वाइल्डकार्ड वर्णों का समर्थन करता है:
*(स्टार) ठीक एक शब्द से मेल खाता है.
#(hash) शून्य या अधिक शब्दों से मेल खाता है.
उदाहरण के लिए, रूटिंग कुंजी "apple.*.banana" से बंधी कतार "apple.orange.banana" या "apple.strawberry.banana" जैसी कुंजियों वाले संदेश प्राप्त करेगी। #.banana से बंधी कतार "apple.banana" या "apple.orange.banana" जैसी कुंजियों वाले संदेश प्राप्त करेगी।
काफ्का
काफ़्का की रूटिंग सरल है। इसके मुख्य घटक हैं:
- निर्माता: रैबिटएमक्यू के समान, यह टॉपिक पर संदेश भेजता है।
- विषय। संदेश संग्रहीत करता है। निर्माता उस विषय को निर्दिष्ट करते हैं जिस पर वे संदेश भेजते हैं।
- विभाजन। प्रत्येक विषय विभाजनों में विभाजित होता है, जो संदेशों के भौतिक भंडारण का प्रतिनिधित्व करता है। निर्माता संदेशों को रूट करने के लिए एक कुंजी निर्दिष्ट कर सकते हैं, यह सुनिश्चित करते हुए कि समान कुंजी वाले सभी संदेश एक ही विभाजन से संबंधित हैं।
- उपभोक्ता। RabbitMQ उपभोक्ताओं के विपरीत, Kafka उपभोक्ता Topics से संदेश खींचते हैं । वे एक समय में केवल एक Topic से संदेश पढ़ सकते हैं।
रैबिटएमक्यू की तुलना में, काफ़्का की रूटिंग क्षमताएँ सीमित हैं। इसे ग्रैन्युलर रूटिंग के लिए नहीं बल्कि उच्च प्रदर्शन और स्केलिंग के लिए डिज़ाइन किया गया है।
यहां एक महत्वपूर्ण बात ध्यान देने योग्य है:
रैबिटएमक्यू में , जब कोई उपभोक्ता कतार से कोई संदेश प्राप्त करता है, तो वे उसे "चुरा" लेते हैं। यदि सफलतापूर्वक स्वीकार कर लिया जाता है, तो अन्य उपभोक्ताओं को संदेश नहीं मिलेगा। यदि वे एक ही उपभोक्ता समूह में हैं, तो काफ़्का उपभोक्ता उसी तरह व्यवहार करते हैं। उपभोक्ता समूह एक काफ़्का अमूर्तता है, जो कई उपभोक्ताओं को एक ही विषय से स्वतंत्र रूप से पढ़ने की अनुमति देता है, यह सुनिश्चित करता है कि प्रत्येक उपभोक्ता समूह सभी विषय संदेशों को संसाधित करता है।
दृढ़ता और स्थायित्व
RabbitMQ में स्थायित्व और दृढ़ता अलग-अलग विशेषताएं हैं:
स्थायित्व। यह क्यू और एक्सचेंज की एक विशेषता है। क्यू दो प्रकार के होते हैं: टिकाऊ और क्षणिक। एक टिकाऊ क्यू (या एक्सचेंज) अपने मेटाडेटा को डिस्क पर संग्रहीत करता है और ब्रोकर के पुनरारंभ होने पर भी टिक सकता है। क्षणिक क्यू ऐसा नहीं करते।
दृढ़ता। एक टिकाऊ कतार संदेश की स्थायित्व की गारंटी नहीं देती है। इसे टिकाऊ बनाने के लिए, आपको दृढ़ता को कॉन्फ़िगर करना होगा। जब प्रकाशक कोई संदेश भेजता है, तो वह दृढ़ता गुण निर्दिष्ट कर सकता है। इस मामले में, एक संदेश आंतरिक डिस्क संग्रहण में संग्रहीत किया जाएगा और ब्रोकर पुनरारंभ के बाद उपलब्ध होगा।
काफ़्का सब कुछ डिस्क पर संग्रहीत करता है। रैबिटएमक्यू के विपरीत, जो उपभोक्ता स्वीकृति के बाद संदेशों को हटा देता है, काफ़्का सभी संदेशों को तब तक बनाए रखता है जब तक कि वे टाइम-टू-लाइव (टीटीएल) या डिस्क आकार सीमा तक नहीं पहुँच जाते। यह संदेशों को अलग-अलग या समान उपभोक्ता समूह द्वारा पुनः संसाधित करने की अनुमति देता है।
अनुमापकता
रैबिटएमक्यू और काफ्का दोनों क्लस्टरिंग का समर्थन करते हैं, जहां कई ब्रोकर्स एक साथ काम करते हैं।
RabbitMQ में, क्लस्टरिंग उपलब्धता में सुधार करता है और डेटा सुरक्षा सुनिश्चित करता है। अगर हम प्रदर्शन के बारे में बात करते हैं, तो वर्टिकल स्केलिंग आपके RabbitMQ को बढ़ावा देने का एक बेहतर तरीका है। क्षैतिज स्केलिंग महत्वपूर्ण सिंक्रोनाइज़ेशन ओवरहेड जोड़ सकती है। आम तौर पर, आप एक ब्रोकर के विफल होने की स्थिति में उपलब्धता सुनिश्चित करने के लिए 3-ब्रोकर क्लस्टर रखना पसंद करेंगे।
RabbitMQ बॉक्स से बाहर कतार विभाजन का समर्थन नहीं करता है, लेकिन यह ध्यान देने योग्य है कि इसमें है
काफ़्का कुशलता से स्केल करता है। यह न केवल उपलब्धता और डेटा सुरक्षा प्रदान करता है, बल्कि यह डेटा प्रोसेसिंग के थ्रूपुट को भी बेहतर बनाता है। यहाँ मुख्य अवधारणा विभाजन है। प्रत्येक विषय में विन्यास योग्य विभाजनों की संख्या होती है। प्रत्येक विभाजन दूसरों से अलग होकर काम करता है, जो एक भौतिक डेटा भंडारण और प्रसंस्करण के रूप में कार्य करता है। आप क्लस्टर में प्रत्येक विभाजन की प्रतिकृति बना सकते हैं, जो दोष सहिष्णुता सुनिश्चित करता है। निर्माता और उपभोक्ता केवल मुख्य (या प्राथमिक) विभाजन के साथ काम करते हैं। यदि इस विभाजन वाला ब्रोकर बंद हो जाता है, तो सिस्टम प्रतिकृतियों से एक नया प्राथमिक विभाजन चुनता है।
विभाजनों की सही संख्या चुनना महत्वपूर्ण है। नोड विफलता के मामले में विभाजनों की एक बड़ी संख्या सिस्टम रिकवरी को धीमा कर देती है। इसके विपरीत, यह उपभोक्ता समूह के लिए थ्रूपुट और समानांतरता के स्तर को सीमित करता है। एक उपभोक्ता समूह के भीतर, प्रत्येक विभाजन केवल एक उपभोक्ता (जो आपके एप्लिकेशन में प्रभावी रूप से एक थ्रेड है) के साथ काम कर सकता है। इसलिए, तीन विभाजन होने से तीन से अधिक उपभोक्ता होने का कोई मतलब नहीं होगा क्योंकि बाकी निष्क्रिय रहेंगे।
आदेश
रैबिटएमक्यू एकल कतार के भीतर क्रमबद्धता की गारंटी देता है। एक उपभोक्ता संदेशों को क्रम में संसाधित करेगा। हालाँकि, कई उपभोक्ताओं के साथ स्थिति बदल जाती है। यदि एक उपभोक्ता विफल हो जाता है, तो सिस्टम कतार में अस्वीकृत संदेशों को वापस कर देता है, लेकिन अगला उपभोक्ता पहले से ही अगले बैच को संसाधित कर सकता है। तो, विकल्प क्या हैं?
- काफ़्का का उपयोग करें! काफ़्का एक विभाजन के भीतर ऑर्डरिंग की गारंटी देता है (यह सहज है क्योंकि यह एक समय में एक विभाजन के साथ काम कर सकता है)। हालाँकि, काफ़्का पूरे विषय के लिए ऑर्डरिंग की गारंटी नहीं देता है। आमतौर पर, ग्राहक आईडी या भुगतान आईडी के भीतर ऑर्डर बनाए रखना आवश्यक है। इसलिए, यदि निर्माता सही विभाजन कुंजी का उपयोग करता है, तो आप अपने सिस्टम के लिए सटीक ऑर्डरिंग प्राप्त कर सकते हैं।
- उपयोग
सुसंगत हैश एक्सचेंज प्लगइन सिंगल-एक्टिव कंज्यूमर विकल्प के साथ, यह रैबिटएमक्यू को काफ्का में बदल देता है। यह आपको "पार्टीशन" देता है और सुनिश्चित करता है कि प्रत्येक पार्टिशन के साथ केवल एक कंज्यूमर ही काम कर सकता है।
डिलीवरी की गारंटी
रैबिटएमक्यू और काफ्का "कम से कम एक बार" डिलीवरी की गारंटी प्रदान करते हैं, जिसका अर्थ है कि डुप्लिकेट संभव है, लेकिन संदेशों को कम से कम एक बार पूरी तरह से संसाधित किया जाएगा।
काफ़्का में और भी डिलीवरी विशेषताएं हैं:
- आइडेम्पोटेंट प्रोड्यूसर। काफ्का में, आप अपने प्रोड्यूसर को डुप्लिकेट संदेशों को बदलने के लिए कॉन्फ़िगर कर सकते हैं। रैबिटएमक्यू प्रोड्यूसर कतार में डुप्लिकेट भेज सकता है।
- काफ़्का प्रोसेसिंग के भीतर बिल्कुल एक बार डिलीवरी। बिल्कुल एक बार - सबसे मजबूत गारंटी है। यह सुनिश्चित करता है कि प्रत्येक संदेश को सिर्फ़ एक बार प्रोसेस किया जाएगा, न ज़्यादा और न ही कम। काफ़्का में, आप इसे काफ़्का ट्रांज़ैक्शन के साथ प्राप्त कर सकते हैं: जब आप एक काफ़्का टॉपिक से उपभोग करते हैं और दूसरे काफ़्का टॉपिक पर लिखते हैं।
अतिरिक्त सुविधाओं
जैसा कि पहले बताया गया था, रूटिंग लचीलेपन को त्यागकर, काफ़्का बदले में शक्तिशाली सुविधाएँ लाता है।
काफ़्का शक्तिशाली स्ट्रीमिंग प्रोसेसिंग लाइब्रेरीज़ प्रदान करता है:
- काफ़्का स्ट्रीम्स। काफ़्का के भीतर वास्तविक समय डेटा प्रसंस्करण और रूपांतरण की अनुमति देता है।
- KSQL. स्ट्रीमिंग डेटा को क्वेरी और रूपांतरित करने के लिए SQL जैसा इंटरफ़ेस प्रदान करता है, जो काफ़्का विषयों द्वारा समर्थित टिकाऊ तालिका अमूर्तता बनाता है।
काफ्का स्ट्रीम्स के साथ, आप अपने विषय पर समय एकत्रीकरण कर सकते हैं और परिणामों को किसी अन्य विषय या डेटाबेस पर भेज सकते हैं।
आइए कल्पना करें कि आपके पास विभिन्न मुद्रा जोड़ों में विनिमय दरों के साथ एक विषय है, और आप समय अवधि (5 मिनट, 30 मिनट, 1 घंटा, आदि) के भीतर ओपन-हाई-लो-क्लोज चार्ट (OHLC भी) डेटा को एकत्रित करना चाहते हैं।
एक विकल्प समय-श्रृंखला डेटाबेस में डेटा संग्रहीत करना है, जो इस तरह की प्रोसेसिंग के लिए उपयुक्त है। हालाँकि, अगर आपके पास काफ़्का है तो आपको इसकी ज़रूरत नहीं है। सरल काफ़्का स्ट्रीम एग्रीगेशन का उपयोग करके, आप काफ़्का विषय के शीर्ष पर OHLC डेटा की गणना कर सकते हैं और परिणामों को आगे की क्वेरी के लिए किसी भी डेटाबेस में डाल सकते हैं।
काफ़्का आपको संसाधित संदेशों को तालिका के रूप में प्रस्तुत करने की भी अनुमति देता है। यह एकत्रीकरण परिणामों को एक तालिका अमूर्तता में रखता है, जिसे आप KSQL के माध्यम से एक्सेस कर सकते हैं। ऐसी तालिका स्थिति टिकाऊ होती है। यदि ब्रोकर पुनः आरंभ होता है, तो यह संबंधित विषय से नवीनतम स्थिति को पुनः स्थापित करेगा।
जैसा कि हम देखते हैं, काफ़्का बुनियादी संदेश ब्रोकर कार्यक्षमता से आगे बढ़कर वास्तविक समय प्रसंस्करण और ETL के क्षेत्र में कदम रखता है।
निष्कर्ष
काफ़्का और रैबिटएमक्यू दोनों ही उच्च-थ्रूपुट, कम-विलंबता परिदृश्यों के लिए उत्कृष्ट उपकरण हैं। चुनाव उपयोग के मामले, वास्तुकला और भविष्य की आवश्यकताओं की बारीकियों पर निर्भर करता है। उदाहरण के लिए, काफ़्का दीर्घकालिक लेनदेन ईवेंट संग्रहण के लिए आदर्श है, जबकि रैबिटएमक्यू प्रोटोकॉल संगतता और रूटिंग लचीलेपन की आवश्यकता वाले परिदृश्यों में उत्कृष्ट है। जब रैबिटएमक्यू और काफ़्का दोनों फिट हों, तो अपनी भविष्य की ज़रूरतों पर विचार करें।