RabbitMQ और चैनल और कनेक्शन के बीच संबंध


176

RabbitMQ जावा ग्राहक निम्नलिखित अवधारणाओं है:

  • Connection - एक RabbitMQ सर्वर उदाहरण के लिए एक कनेक्शन
  • Channel - ???
  • कंज्यूमर थ्रेड पूल - थ्रेड का एक पूल जो RabbitMQ सर्वर कतारों से संदेशों का उपभोग करता है
  • कतार - एक संरचना जो FIFO क्रम में संदेश रखती है

मैं संबंधों को समझने की कोशिश कर रहा हूं, और इससे भी महत्वपूर्ण बात यह है कि उनके बीच के संबंध

  1. मुझे अभी भी यकीन नहीं है कि क्या Channelहै, इस तथ्य के अलावा कि यह संरचना है जिसे आप प्रकाशित करते हैं और इससे उपभोग करते हैं, और यह एक खुले कनेक्शन से बनाया गया है। यदि कोई मुझे समझा सकता है कि "चैनल" क्या दर्शाता है, तो यह कुछ चीजों को स्पष्ट करने में मदद कर सकता है।
  2. चैनल और कतार के बीच क्या संबंध है? क्या उसी चैनल का उपयोग कतारों को गुणा करने के लिए किया जा सकता है, या क्या उसे 1: 1 होना चाहिए?
  3. क्यू और उपभोक्ता पूल के बीच क्या संबंध है? क्या कई उपभोक्ताओं को एक ही कतार में सदस्यता दी जा सकती है? क्या एक ही उपभोक्ता द्वारा कई कतारों का उपभोग किया जा सकता है? या संबंध 1: 1 है?

यहाँ किसी भी मदद के लिए अग्रिम धन्यवाद!


इस प्रश्न के उत्तर ने मुझे यहां प्रश्न पूछने के बजाय गोलंग ग्राहक के साथ इस मुद्दे की रिपोर्टिंग करने का नेतृत्व किया ।
ब्रूस एडम्स

चैनल एक तार्किक अवधारणा है जिसका उपयोग ग्राहक और नोड के बीच एकल भौतिक टीसीपी कनेक्शन को बहुसंकेतन करने के लिए किया जाता है। चैनल नंबर AMQP फ्रेम के संदेश हेडर में शामिल है।
यम

जवाबों:


196
  1. एक Connection, संदेश दलाल को कोई वास्तविक TCP कनेक्शन का प्रतिनिधित्व करता है, जबकि एक Channelएक आभासी कनेक्शन (AMQP कनेक्शन) यह अंदर है। इस तरह आप टीसीपी कनेक्शन के साथ ब्रोकर को ओवरलोड किए बिना अपने आवेदन के अंदर जितने चाहें (वर्चुअल) कनेक्शन का उपयोग कर सकते हैं।

  2. आप Channelहर चीज के लिए एक का उपयोग कर सकते हैं । हालाँकि, यदि आपके पास कई थ्रेड हैं, तो यह Channelप्रत्येक थ्रेड के लिए भिन्न का उपयोग करने का सुझाव दिया गया है ।

    जावा क्लाइंट एपीआई गाइड में चैनल थ्रेड-सुरक्षा :

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

    वहाँ के बीच कोई सीधा संबंध है Channelऔर Queue। ए Channelका उपयोग ब्रोकर को एएमक्यूपी कमांड भेजने के लिए किया जाता है। यह एक कतार या इसी तरह की रचना हो सकती है, लेकिन ये अवधारणाएं एक साथ बंधी नहीं हैं।

  3. प्रत्येक Consumerउपभोक्ता थ्रेड पूल से आवंटित अपने स्वयं के धागे में चलाता है। यदि एक से अधिक उपभोक्ताओं को एक ही कतार में सदस्यता दी जाती है, तो दलाल उनके बीच संदेशों को समान रूप से वितरित करने के लिए राउंड-रॉबिन का उपयोग करता है। ट्यूटोरियल दो देखें : "कार्य पंक्ति"

    एक Consumerसे अधिक कतारों में इसे संलग्न करना भी संभव है । आप उपभोक्ताओं को कॉलबैक के रूप में समझ सकते हैं। इन्हें हर उस समय कहा जाता है जब कोई संदेश उपभोक्ता पर आता है, जिसके लिए बाध्य किया जाता है। जावा क्लाइंट के मामले में, प्रत्येक उपभोक्ता के पास एक विधि होती है handleDelivery(...), जो कॉलबैक विधि का प्रतिनिधित्व करती है। आप आमतौर पर क्या करते हैं, उपवर्ग DefaultConsumerऔर ओवरराइड handleDelivery(...)। नोट: यदि आप एक ही उपभोक्ता उदाहरण को कई कतारों में संलग्न करते हैं, तो इस विधि को विभिन्न थ्रेड्स द्वारा बुलाया जाएगा। इसलिए यदि आवश्यक हो तो सिंक्रनाइज़ेशन का ख्याल रखें।


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

1
यदि आप एक ही चैनल से एक ही उपभोक्ता उदाहरण को कई कतारों में संलग्न करते हैं, तो इसका मतलब होगा कि कॉलबैक को एक ही थ्रेड पर भेजा जाता है। उस स्थिति में आपको सिंक्रनाइज़ेशन की आवश्यकता नहीं होगी, क्या आप करेंगे?
फ़िलिप करें

क्या मैं केवल एक कनेक्शन का उपयोग कर सकता हूं और कनेक्शन पूल के बजाय चैनलों के पूल का उपयोग कर सकता हूं? क्या यह संदेश प्रकाशन थ्रूपुट को प्रभावित करेगा?
क्विक

4
मुझे लगता है कि जावा क्लाइंट एपीआई का यह संदर्भ अब पुराना हो गया है और वास्तव में आज का संदर्भ सीधे इस उत्तर में उद्धरण का खंडन करता है। आज का संदर्भ कहता है, "चैनल उदाहरणों को थ्रेड्स के बीच साझा नहीं किया जाना चाहिए"।
एडविन डेलोरोज़ो

1
@EdwinDalorzo - ऐसा लगता है कि मूल रूप से लिखा है कि प्रलेखन ने पूरी तरह से चैनल-कनेक्शन डाइकोटॉमी को नहीं समझा। AMQP 0.9.1 की मौलिक वास्तुकला वास्तव में एक चैनल को एक सत्र के रूप में मानती है, इसलिए एक सत्र को साझा करने वाले विभिन्न धागे वास्तव में बकवास है। मेरा अनुमान है कि बदलाव का कारण यही है।
TheMayer

53

एएमक्यूपी प्रोटोकॉल "हुड के तहत" क्या करता है की एक अच्छी वैचारिक समझ यहां उपयोगी है। मुझे लगता है कि AMQP 0.9.1 को तैनात करने के लिए चुना गया प्रलेखन और एपीआई यह विशेष रूप से भ्रामक बनाता है, इसलिए सवाल ही एक है जिसके साथ कई लोगों को कुश्ती करनी है।

टी एल; डॉ

एक कनेक्शन AMQP सर्वर के साथ भौतिक रूप से बातचीत की गई टीसीपी सॉकेट है। उचित रूप से लागू किए गए ग्राहकों के पास इनमें से एक आवेदन होगा, थ्रेड-सेफ, थ्रेड्स के बीच साझा करने योग्य।

कनेक्शन पर एक चैनल एक एकल अनुप्रयोग सत्र है। एक धागे में इनमें से एक या अधिक सत्र होंगे। AMQP आर्किटेक्चर 0.9.1 यह है कि इन्हें थ्रेड्स के बीच साझा नहीं किया जाना चाहिए, और इसे बनाने वाले धागे को बंद / नष्ट कर दिया जाना चाहिए। विभिन्न प्रोटोकॉल उल्लंघन होने पर वे सर्वर द्वारा भी बंद कर दिए जाते हैं।

एक उपभोक्ता एक आभासी निर्माण है जो किसी विशेष चैनल पर "मेलबॉक्स" की उपस्थिति का प्रतिनिधित्व करता है। एक उपभोक्ता का उपयोग ब्रोकर को एक विशेष कतार से संदेशों को उस चैनल समापन बिंदु पर पुश करने के लिए कहता है।

कनेक्शन तथ्य

सबसे पहले, जैसा कि दूसरों ने सही ढंग से बताया है, एक कनेक्शन वह वस्तु है जो सर्वर के वास्तविक टीसीपी कनेक्शन का प्रतिनिधित्व करता है। एएमक्यूपी में प्रोटोकॉल स्तर पर कनेक्शन निर्दिष्ट किए जाते हैं, और ब्रोकर के साथ सभी संचार एक या अधिक कनेक्शन पर होते हैं।

  • चूंकि यह एक वास्तविक टीसीपी कनेक्शन है, इसलिए इसमें एक आईपी एड्रेस और पोर्ट # है।
  • प्रोटोकॉल पैरामीटर कनेक्शन स्थापित करने के एक भाग के रूप में प्रति ग्राहक आधार पर बातचीत की जाती है (एक प्रक्रिया जिसे हैंडशेक के रूप में जाना जाता है ।
  • यह लंबे समय तक रहने के लिए डिज़ाइन किया गया है ; ऐसे कुछ मामले हैं जहां कनेक्शन बंद होना प्रोटोकॉल डिजाइन का हिस्सा है।
  • ओएसआई के नजरिए से, यह शायद लेयर 6 के आसपास कहीं रहता है
  • कनेक्शन की स्थिति की निगरानी के लिए दिल की धड़कन स्थापित की जा सकती है, क्योंकि टीसीपी में ऐसा करने के लिए खुद में और कुछ भी शामिल नहीं है।
  • समर्पित टीसीपी सॉकेट के लिए एक समर्पित थ्रेड प्रबंधन पढ़ना और लिखना सबसे अच्छा है। सबसे अधिक, यदि सभी नहीं, तो RabbitMQ ग्राहक ऐसा करते हैं। इस संबंध में, वे आम तौर पर थ्रेड-सुरक्षित होते हैं।
  • अपेक्षाकृत बोलने, कनेक्शन बनाने के लिए "महंगे" हैं (हैंडशेक के कारण), लेकिन व्यावहारिक रूप से बोलना, यह वास्तव में कोई फर्क नहीं पड़ता। अधिकांश प्रक्रियाओं को वास्तव में केवल एक कनेक्शन ऑब्जेक्ट की आवश्यकता होगी। लेकिन, आप एक पूल में कनेक्शन बनाए रख सकते हैं, यदि आपको लगता है कि आपको एक ही धागे की तुलना में अधिक थ्रूपुट की आवश्यकता है / सॉकेट प्रदान कर सकता है (वर्तमान कंप्यूटिंग प्रौद्योगिकी के साथ संभावना नहीं है)।

चैनल के तथ्य

एक चैनल अनुप्रयोग सत्र है जो आपके ऐप के प्रत्येक टुकड़े के लिए RabbitMQ ब्रोकर के साथ संवाद करने के लिए खोला जाता है। यह एकल कनेक्शन पर काम करता है , और ब्रोकर के साथ एक सत्र का प्रतिनिधित्व करता है ।

  • चूंकि यह एप्लिकेशन लॉजिक के तार्किक भाग का प्रतिनिधित्व करता है, प्रत्येक चैनल आमतौर पर अपने स्वयं के थ्रेड पर मौजूद होता है।
  • आमतौर पर, आपके ऐप द्वारा खोले गए सभी चैनल एकल कनेक्शन साझा करेंगे (वे हल्के सत्र हैं जो कनेक्शन के शीर्ष पर काम करते हैं)। कनेक्शन थ्रेड-सुरक्षित हैं, इसलिए यह ठीक है।
  • अधिकांश एएमक्यूपी ऑपरेशन चैनलों पर होते हैं।
  • OSI लेयर के नजरिए से, चैनल शायद लेयर 7 के आसपास हैं ।
  • चैनल क्षणिक होने के लिए डिज़ाइन किए गए हैं ; एएमक्यूपी के डिजाइन का हिस्सा यह है कि चैनल आमतौर पर एक त्रुटि के जवाब में बंद हो जाता है (जैसे मौजूदा कतार को हटाने से पहले विभिन्न मापदंडों के साथ एक कतार को फिर से घोषित करना)।
  • चूंकि वे क्षणिक हैं, इसलिए चैनलों को आपके ऐप द्वारा पूल नहीं किया जाना चाहिए।
  • चैनल की पहचान करने के लिए सर्वर एक पूर्णांक का उपयोग करता है। जब कनेक्शन को प्रबंधित करने वाला धागा किसी विशेष चैनल के लिए एक पैकेट प्राप्त करता है, तो वह इस नंबर का उपयोग ब्रोकर को यह बताने के लिए करता है कि पैकेट किस चैनल / सत्र का है।
  • चैनल आमतौर पर थ्रेड-सुरक्षित नहीं होते हैं क्योंकि यह उन्हें थ्रेड के बीच साझा करने का कोई मतलब नहीं होगा। यदि आपके पास एक और धागा है जिसे ब्रोकर का उपयोग करने की आवश्यकता है, तो एक नए चैनल की आवश्यकता है।

उपभोक्ता तथ्य

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

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

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


1
"चैनलों को पूल नहीं किया जाना चाहिए", यही मैं देख रहा हूँ
ospider

"चूंकि वे क्षणिक हैं, चैनलों को आपके ऐप द्वारा पूल नहीं किया जाना चाहिए।" - क्या आप स्पष्ट कर सकते हैं कि आप इस निष्कर्ष पर कैसे पहुंचे। डॉक्स चैनल पूलिंग की सलाह देता है यदि "थ्रेड प्रति चैनल" कार्यान्वयन बहुत अधिक संसाधन का उपयोग कर रहा है, तो यहां देखें: rabbitmq.com/channels.html#resource-usage
ymas

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

21

मुझे यह लेख मिला जो एएमक्यूपी मॉडल के सभी पहलुओं की व्याख्या करता है, जिनमें से, चैनल एक है। मुझे यह मेरी समझ से बाहर निकालने में बहुत मददगार लगा

https://www.rabbitmq.com/tutorials/amqp-concepts.html

कुछ अनुप्रयोगों को एएमक्यूपी ब्रोकर के लिए कई कनेक्शन की आवश्यकता होती है। हालांकि, कई टीसीपी कनेक्शन को एक ही समय में खुला रखना अवांछनीय है क्योंकि ऐसा करने से सिस्टम संसाधनों की खपत होती है और फायरवॉल को कॉन्फ़िगर करना अधिक कठिन हो जाता है। AMQP 0-9-1 कनेक्शन चैनलों के साथ बहुसंकेतित होते हैं जिन्हें "हल्के कनेक्शन जो एकल टीसीपी कनेक्शन साझा करते हैं" के रूप में सोचा जा सकता है।

प्रसंस्करण के लिए कई थ्रेड / प्रक्रियाओं का उपयोग करने वाले अनुप्रयोगों के लिए, प्रति थ्रेड / प्रक्रिया एक नया चैनल खोलना और उनके बीच चैनल साझा नहीं करना बहुत आम है।

किसी विशेष चैनल पर संचार दूसरे चैनल पर संचार से पूरी तरह से अलग है, इसलिए प्रत्येक एएमक्यूपी विधि एक चैनल नंबर भी लेती है जो ग्राहक यह पता लगाने के लिए उपयोग करते हैं कि कौन सा चैनल किस विधि के लिए है (और इस प्रकार, किस इवेंट हैंडलर को लागू करना है, उदाहरण के लिए) ।


4

एक संबंध है जैसे कि एक टीसीपी कनेक्शन में कई चैनल हो सकते हैं

चैनल : यह एक कनेक्शन के अंदर एक आभासी कनेक्शन है। किसी कतार से संदेशों को प्रकाशित या उपभोग करते समय - यह सब एक चैनल पर किया जाता है जबकि कनेक्शन : यह आपके आवेदन और रैबिटएमक्यू ब्रोकर के बीच एक टीसीपी कनेक्शन है।

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

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