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