2012-05-02 12 views
51

मैं खरगोश (और प्रोग्रामिंग) के साथ एक नौसिखिया हूं इसलिए यह स्पष्ट है कि अगर यह स्पष्ट है। मैं कतार पर काम कर रहे धागे के बीच साझा करने के लिए एक पूल बना रहा हूं लेकिन मुझे यकीन नहीं है कि मुझे पूल में कनेक्शन या चैनल का उपयोग करना चाहिए या नहीं।क्या खरगोश में पूलिंग कनेक्शन या चैनल के बीच कोई प्रदर्शन अंतर है?

मुझे पता है कि मुझे वास्तविक काम करने के लिए चैनलों की आवश्यकता है, लेकिन क्या एक चैनल प्रति कनेक्शन (कतार से अधिक थ्रूपुट के संदर्भ में) का प्रदर्शन लाभ है? या क्या मैं प्रति एप्लिकेशन एक कनेक्शन और पूल के कई चैनलों का उपयोग कर बेहतर हूं?

नोट: क्योंकि मैं संसाधनों को पूल कर रहा हूं, प्रारंभिक लागत एक कारक नहीं है, क्योंकि मुझे पता है कि चैनल चैनलों से अधिक महंगा हैं। मैं थ्रूपुट में अधिक रुचि रखता हूं।

उत्तर

70

मुझे यह rabbitmq website पर मिला है, यह नीचे है, इसलिए मैंने नीचे प्रासंगिक भाग उद्धृत किया है।

टीएल; डी संस्करण यह है कि आपके पास प्रति आवेदन 1 कनेक्शन और प्रति थ्रेड 1 चैनल होना चाहिए। उम्मीद है की वो मदद करदे।

कनेक्शन

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

चैनल

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

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

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

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

इसके अतिरिक्त यह करने के लिए केवल प्रति चैनल 1 उपभोक्ता है की सलाह दी है।

ये केवल दिशा निर्देश हैं ताकि आप कुछ परीक्षण क्या आपके लिए सबसे अच्छा काम करता है देखने के लिए क्या करना होगा।

इस धागे में कुछ अंतर्दृष्टि here और here है।

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

+2

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

+1

ठीक संपादित किया गया। यह अजीब बात है कि मैंने लिखा है, क्या यह संभव है कि दस्तावेज बदल गया हो? संदेह है। सिर्फ मेरे हिस्से पर एक गलती, माफ़ी। अनुशंसा हालांकि वही रहता है। 1 उपभोक्ता, 1 चैनल, 1 धागा – robthewolf

+5

क्या चैनल थ्रेड-सुरक्षित हैं कार्यान्वयन पर निर्भर करता है। जावा इम्प्ल्यू सुरक्षित है, जबकि .NET एक नहीं है Http://stackoverflow.com/a/17829906/709537 –

14

स्वीकार किए जाते हैं जवाब के अलावा:

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

ऊपर वर्णित दूसरी चिंता यह है कि प्रकाशन और उपभोग संचालन अवरुद्ध कर रहे हैं, जिससे संदेश कतार में आता है। अधिक कनेक्शन होने से यह सुनिश्चित होगा कि 1. प्रत्येक संदेश के लिए प्रोसेसिंग समय अन्य संदेशों को अवरुद्ध नहीं करता है 2. बड़े संदेश अन्य संदेशों को अवरुद्ध नहीं कर रहे हैं।

यही कारण है कि यह एक छोटे से कनेक्शन पूल होने

+3

और यह छोटा कनेक्शन पूल आप सुझाव देते हैं, क्या यह प्रदान किया गया है या यह मुझे कुछ लागू करना चाहिए? – Mahdi

0

"धागा प्रति एक चैनल" एक सुरक्षित धारणा हो सकता है (मैं हो सकता है का कहना है के रूप में मैं नहीं है (ऊपर उठाया संसाधन चिंताओं को ध्यान में होने) पर विचार के लायक है अपने आप से किसी भी शोध किया जाता है और मैं प्रलेखन :) शक करना), लेकिन सावधान रहना एक मामले में जहां यह टूट जाता है है कि वहाँ कोई कारण नहीं है:

आप RabbitMQ Direct reply-to साथ RPC का उपयोग आप हैं तो आप के लिए एक ही चैनल का पुन: उपयोग नहीं कर सकते एक और आरपी के लिए उपभोग सी अनुरोध मैं google user group में उस के बारे में जानकारी के लिए पूछा और जवाब मैं माइकल Klishin (जो सक्रिय रूप से RabbitMQ विकास में शामिल किया जा रहा है) से मिला है कि

सीधा जवाब करने के लिए चैनल को साझा करने के किसी भी तरह से साथ प्रयोग किया जा करने के लिए नहीं है था ।

मैं ईमेल अपनी दस्तावेज़ीकरण अद्यतन करने के लिए निर्णायक व्याख्या करने के लिए कैसेamq.rabbitmq.reply-to हुड के नीचे काम कर रहा है और मैं अभी भी एक जवाब (या अद्यतन) के लिए प्रतीक्षा कर रहा हूँ है।

तो यदि आप "प्रति चैनल एक चैनल" से चिपकना चाहते हैं तो सावधान रहें क्योंकि यह प्रत्यक्ष उत्तर-के साथ अच्छा काम नहीं करेगा।

संबंधित मुद्दे