2012-10-22 13 views
5

मैं वर्तमान में कार्यकर्ता socketio.sgunicorn.GeventSocketIOWorker का उपयोग कर gunicorn सर्वर के साथ कई कार्यकर्ताओं भर gevent-socketio पैमाने पर करने के कोशिश कर रहा हूँ के साथ विफल रहता है। जब मैं मौजूद हूं तो मैं websockets का उपयोग कर रहा हूं अन्यथा मैं एक्सएचआर-मतदान (आईई आदि के लिए) मजबूर कर रहा हूं।gevent-socketio के साथ एकाधिक कार्यकर्ताओं क्योंकि सत्र के XHR-मतदान परिवहन

एक्सएचआर-मतदान को निम्नलिखित चुनावों का ट्रैक रखने के लिए एक सत्र की आवश्यकता है, लेकिन जैसे ही मैं एक या दो से अधिक श्रमिकों से जाता हूं, अनुरोध स्वयं के बीच फैलता है जिसका मतलब है कि राज्य खो गया है और सबकुछ टूट जाता है।

मुझे लगता है कि कोड के निम्नलिखित लाइनों प्रासंगिक है: https://github.com/abourget/gevent-socketio/blob/master/socketio/handler.py#L104-106 मैं मैं उदाहरण redis जो मैं नियमित pubsub-कार्यों के लिए उपयोग कर रहा हूँ के लिए, कुछ अन्य भंडारण इंजन की जरूरत है, लेकिन यह गहरी वास्तविक पुस्तकालय के अंदर है लगता है।

तो मेरे सवाल है कैसे मैं अपने आवेदन में विश्व स्तर पर एक और बैकएंड इंजन के लिए इन-स्मृति सत्र भंडारण से जाते हो पुस्तकालय खुद को संशोधित करने के बिना (यह शान से ऊपर के लिंक में सत्र कोड को ओवरराइड करता है?) ? Something like PHP's session directives in php.ini। मुझे लगता है कि एक तर्क दिया जा सकता है कि यह एक बहुत ही सामान्य पायथन प्रश्न है लेकिन मुझे प्रासंगिक जानकारी खोजने में परेशानी हो रही है, और मुझे यह भी अनिश्चितता है कि यह इस पुस्तकालय के लिए काम करेगा।

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

धन्यवाद!

+0

बस एक विचार: कुकीज़ में सत्र-विशिष्ट जानकारी रखें? एक प्रकार का आरईएसटी। –

+0

@moodh क्या आपने कभी इसे हल किया है? साथ ही, क्या कई श्रमिक वास्तव में वैसे भी मदद करते हैं? गेवेन्ट स्वयं ही एक ही घटना लूप में कई कॉलों को संभालने में बहुत अच्छा काम करता है। – pors

+0

नहीं, मैंने छोड़ दिया और इसके बजाए http://pusher.com/ का उपयोग करना शुरू कर दिया। इस समस्या के बारे में gevent-socketio (https://github.com/abourget/gevent-socketio/issues/112) में कुछ टिकट हैं लेकिन मुझे नहीं पता कि वे कितने दूर आए हैं। क्षमा करें :) – moodh

उत्तर

3

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

तर्क परिवर्तन की आवश्यकता वाले सीमाओं को दूर करने के केवल दो तरीके हैं: रनटाइम में स्रोत और पैचिंग को पैच करना। जो भी आपको सबसे ज्यादा पसंद करता है चुनें (या, अच्छी तरह से, कम से कम घृणित: ^))। दूसरे विकल्प के लिए, मैं request_tokens और/या कोड को प्रतिस्थापित करने का सुझाव देता हूं जो इसे एक ही इंटरफ़ेस के साथ किसी अन्य इकाई के साथ बनाता है। पहले पैराग्राफ में बताए गए कारणों से, मुझे सच में लगता है कि सॉकेटियो लेखकों को एक स्रोत पैच स्वीकार करने की संभावना है जो इसे प्रस्तावित करते समय बाह्य सत्र हैंडलिंग तंत्र का उपयोग करने की अनुमति देगा।

सत्र जानकारी के लिए मानक स्थान हैं: साझा स्मृति, फ़ाइलें, डेटाबेस। मेरा सुझाव है कि आप तर्क को इस तरह से बदल दें कि सॉकेटियो आपके वेब ढांचे (या जो भी आपके पृष्ठों को लिखता है) के समान तंत्र का उपयोग करता है। उदाहरण यहाँ पर

+0

आपके उत्तर के लिए धन्यवाद! हालांकि यह समाधान नहीं है, फिर भी मैं आपकी जानकारी के लिए बक्षीस प्रदान करूंगा। मैं एक वास्तविक समाधान के लिए चारों ओर इंतजार करूंगा लेकिन आपके जवाब ने मुझे समस्या को और भी समझने में मदद की। मुझे पूरा यकीन है कि हम आपके द्वारा सुझाए गए request_tokens को बदलकर इसे हल कर देंगे। आपके जवाब का धन्यवाद! – moodh

+0

2 मूड: मैंने "आपके तंत्र के रूप में उसी तंत्र का उपयोग करने के लिए" का सुझाव दिया है। तो यह जानने के बिना लिखना असंभव है कि यह तंत्र क्या है। –

+0

मैं श्रमिकों और सर्वरों के बीच सत्र रखने के लिए रेडिस का उपयोग करता हूं, फ्लास्क के लिए विशिष्ट कुछ भी नहीं (फ्रेमवर्क जो मैं उपयोग कर रहा हूं)। फ्लास्क को रेडिस का उपयोग करना संभव हो सकता है लेकिन मैंने अभी तक उस पर ध्यान नहीं दिया है। :) – moodh

0

देखो:

https://github.com/abourget/gevent-socketio/tree/master/examples/pyramid_backbone_redis_chat_persistence

यह कैसे, एक वितरित संदेश कतार

+0

मैं पहले से ही एप्लिकेशन के अंदर रेडिस का उपयोग करता हूं, जो ठीक काम करता है। हालांकि आप मेरी समस्या को समझ में नहीं आ रहे हैं। लाइब्रेरी में गहराई से वास्तविक वास्तविक मतदान सॉकेट है जो समस्या है। :) – moodh

0

बस एक विचार के रूप में redis उपयोग करने के लिए के रूप में मैं एक ही मुद्दा हो रहा है पता चलता है; गनिकोर्न कांटा (वाउ फ्लैग के साथ) देने की जगह, शायद आप अलग-अलग बंदरगाहों पर बंदूक की कई प्रक्रियाओं को जन्म दे सकते हैं, फिर "upstream" block with "sticky" session का उपयोग करके उन पर संतुलन के लिए nginx का उपयोग करें। मेरा मानना ​​है कि नोडज कार्यान्वयन कैसे रेडिस के साथ राज्यों को साझा नहीं करते समय श्रमिकों के मल्टीप्रोसेसिंग को संभालता है।

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