2013-02-28 5 views
8

साथ वेब सॉकेट एकीकृत करने के लिए हम एक काफी जटिल Django आवेदन वर्तमान द्वारा अपाचे/mod_wsgi सेवा की है और एक एडब्ल्यूएस ईएलबी लोड संतुलन के पीछे कई एडब्ल्यूएस EC2 उदाहरणों पर तैनात किया है। क्लाइंट अनुप्रयोग AJAX का उपयोग कर सर्वर सर्वर से इंटरैक्ट करते हैं। वे समय-समय पर नोटिफिकेशन और उनके राज्य के अपडेट पुनर्प्राप्त करने के लिए सर्वर को मतदान करते हैं। हम मतदान को हटाना चाहते हैं और वेब सॉकेट का उपयोग करके को "पुश" के साथ प्रतिस्थापित करना चाहते हैं।कैसे एक Django WSGI

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

हम समझते हैं कि अपाचे/mod_wsgi वेब सॉकेट और nginx/gunicorn साथ इन घटकों की जगह और gevent-WebSocket कार्यकर्ता उपयोग करने के लिए योजना के साथ अच्छी तरह से नहीं खेलते हैं। हालांकि, यदि कई कार्यकर्ताओं में से एक ग्राहकों को वेब सॉकेट स्थापित करने के अनुरोध प्राप्त करता है, और कार्यकर्ता प्रक्रियाओं के जीवनकाल को मुख्य बंदूक प्रक्रिया द्वारा नियंत्रित किया जाता है, तो यह स्पष्ट नहीं है कि अन्य कार्यकर्ता कैसे प्रक्रिया करते हैं, या वास्तव में गैर-बंदूक प्रक्रियाएं इन वेब सॉकेट में डेटा भेज सकती हैं।

एक विशेष मामले के इस एक है: जो जारी करता है एक HTTP अनुरोध एक EC2 उदाहरण (मेजबान) और वांछित व्यवहार करने के लिए निर्देशित किया गया है एक उपयोगकर्ता है कि डेटा वाले किसी अन्य उपयोगकर्ता एक वेब सॉकेट में खुला है के लिए भेजा जाना है एक पूरी तरह से विभिन्न उदाहरण। कोई आसानी से उस प्रणाली को कल्पना कर सकता है जहां प्रत्येक उदाहरण पर ब्रोकर (उदा। Rabbitmq) चल रहा है, उस संदेश को संदेश भेजा जा सकता है जिसमें वेब सॉकेट के माध्यम से भेजा जाने वाला डेटा उस उदाहरण से कनेक्ट किया गया है। लेकिन इन संदेशों के हैंडलर वेब सॉकेट तक कैसे पहुंच सकते हैं, जो कि बंदूकधारी की कार्यकर्ता प्रक्रिया में प्राप्त हुआ था? उच्च स्तरीय पायथन वेब सॉकेट ऑब्जेक्ट्स ने गेवेंट-वेबस्केट और को एक कर्मचारी को उपलब्ध कराया नहीं जा सकता है (वे उदाहरण विधियों को पिकलिंग के लिए कोई समर्थन नहीं है), इसलिए उन्हें आसानी से किसी कार्यकर्ता प्रक्रिया द्वारा साझा नहीं किया जा सकता है आश्चर्यजनक, बाहरी प्रक्रिया।

वास्तव में, इस सवाल की जड़ कैसे वेब सॉकेट जो इस तरह के रूप में सर्वर में ग्राहकों से HTTP अनुरोध द्वारा शुरू की और WSGI द्वारा नियंत्रित किया जाता है संचालकों बाहरी प्रक्रियाओं द्वारा पहुँचा जा सकता है gunicorn करने के लिए नीचे आता है? यह प्रतीत नहीं होता सही कि कार्यकर्ता प्रक्रियाओं, जो HTTP अनुरोध को संभालने के लिए अंडे होगा धागे लंबे समय से चल अन्य प्रक्रियाओं से वेब सॉकेट और समर्थन से निपटने संदेशों पर लटका वेब सॉकेट है कि करने के लिए संदेश भेजने के लिए करना है gunicorn उन कार्यकर्ता प्रक्रियाओं के माध्यम से संलग्न किया गया है।

क्या कोई बता सकता है कि कैसे वेब सॉकेट और डब्लूएसजीआई-आधारित HTTP अनुरोध हैंडलर संभवतः पर्यावरण के बारे में बता सकते हैं?

धन्यवाद।

उत्तर

0

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

क्यों नहीं? यह सब के बाद एक लंबे समय से चलने वाला कनेक्शन है। ऐसे कनेक्शन की देखभाल करने के लिए एक लंबे समय से चलने वाला धागा प्रतीत होता है ... मेरे लिए बिल्कुल प्राकृतिक है।

अक्सर इन घटनाओं में स्थितियों को पढ़ने से अलग से संभाला जाता है।

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

यदि आप चाहें तो इन-कोड संदेश पास करने के लिए आप gevent के async- अनुकूल Queues का भी उपयोग कर सकते हैं।

+0

यदि, एक HTTP अनुरोध को संभालने के परिणामस्वरूप, सर्वर को वेबशॉट के नीचे एक पुश अधिसूचना भेजने की आवश्यकता है कि किसी अन्य उपयोगकर्ता ने एक ही मेजबान या एक अलग मेजबान पर किसी अन्य कार्यकर्ता प्रक्रिया से कनेक्ट किया है, तो प्रेषक कार्यकर्ता को कतारबद्ध करना होगा संदेश (कहीं, लेकिन शायद एक एएमक्यूपी सर्वर के लिए जो प्रत्येक कर्मचारी की सदस्यता लेता है) और प्राप्तकर्ता कार्यकर्ता (जो लक्ष्य क्लाइंट से वेबसाईट पर हो रहा है) को कतार से संदेश पढ़ना होगा और इसे वेब पर भेजना होगा सॉकेट। क्या यह एक उचित वास्तुकला की तरह प्रतीत होता है? – eswenson

+0

मुझे अनुरोध/प्रतिक्रिया प्रसंस्करण की तुलना में "अन्य कार्य" के लिए कार्यकर्ता प्रक्रियाओं का उपयोग करने में सहज महसूस नहीं हुआ था, लेकिन आप कह रहे हैं कि ऐसा कोई कारण नहीं है कि वे क्यों नहीं कर सके। सही? – eswenson

+0

वैसे एक वेबस्केट अब सरल अनुरोध/प्रतिक्रिया प्रबंधन नहीं कर रहा है, है ना? अब यह एक पूर्ण उड़ा हुआ डुप्लेक्स चैनल है। यदि आप पसंद करते हैं तो आप श्रमिकों के पूल को अलग करने के लिए वेबस्केट कनेक्शन बंद कर सकते हैं। हां, आपने जो सुझाव दिया वह सामान्य संग्रह की तरह लगता है। मेरे लिए। :) – Ivo

1

मुझे लगता है कि आपने सही आकलन किया है कि mod_wsgi + websockets एक बुरा संयोजन है।

आप अपने सभी wsgi श्रमिकों को वेब सॉकेट द्वारा गले लगाएंगे और कार्यकर्ता पूल के आकार को बढ़ाने (बड़े पैमाने पर) करने का प्रयास शायद स्मृति उपयोग और संदर्भ स्विचिंग के कारण सर्वर को दबाएगा।

यदि आप सिंक्रोनस wsgi कार्यकर्ता आर्किटेक्चर (जैसा कि gevent, twisted, tornado आदि द्वारा लागू प्रतिक्रियाशील दृष्टिकोण के विपरीत) के साथ चिपकना पसंद है, तो मैं आपको एप्लिकेशन सर्वर के रूप में uWSGI में देखने का सुझाव दूंगा। हाल के संस्करण पुराने तरीके से कुछ यूआरएल को संभाल सकते हैं (यानी आपके मौजूदा डीजेंगो विचार अभी भी पहले जैसा ही काम करेंगे), और अन्य यूआरएल को एसिंक वेबसाइकिल हैंडलर पर रूट करें। यह आपके लिए अपेक्षाकृत चिकनी माइग्रेशन पथ हो सकता है।

+0

हमने तब से एक मॉडल पर स्विच किया है जहां हम एनजीआईएनएक्स का उपयोग हमारी HTTP प्रॉक्सी के रूप में करते हैं और यह या तो बंदूकधारी (डीजेंगो) या नोडजेस के लिए प्रॉक्सी है। नोडजेस ऐप हमारे वेब सॉकेट को संभालता है। हम जल्द ही, बंदूक से दूर हो सकते हैं और यूडब्ल्यूएसजीआई आज़मा सकते हैं, क्योंकि हमें विश्वास है कि प्रदर्शन बेहतर होगा। चाहे हम websockets को पायथन/django पर वापस समर्थन दें या नहीं, इस पर निर्भर करेगा कि क्या हम वास्तव में ऐसा सोचते हैं कि ऐसा करने के लिए बहुत अधिक लाभ है। ऐसा लगता है कि नोडज इन वेबसाइकिल कनेक्शन को ठीक से संभालने लगते हैं। – eswenson

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