के साथ सेलेरी कनेक्शन ड्रॉप हमारे पर्यावरण में, हम कई नोड्स पर समानांतर में कार्यों को चलाने के लिए एडब्ल्यूएस पर खरगोशएमक्यू और सेलेरी का उपयोग करते हैं।एडब्ल्यूएस ईएलबी और खरगोश एमक्यू
हाल ही में हमने खरगोश एमक्यू को 3 नोड्स के समूह में बदल दिया, एक हाई पॉलिसी कॉन्फ़िगर किया और सभी 3 नोड्स के लिए पोर्ट 5672 के लिए एडब्ल्यूएस लोचदार लोड बैलेंसर (ईएलबी) जोड़ा। हमारे सेलेरी श्रमिक और ग्राहक कोड सभी ईएलबी DNS का उपयोग ब्रोकर यूआरएल के रूप में करते हैं।
हमने उस परिवर्तन के बाद से देखा है कि एसिंक कार्यों को समाप्त करने की प्रतीक्षा करने से IOError: Socket closed
अपवाद फेंक देगा।
ईएलबी 60 सेकंड के बाद सभी निष्क्रिय कनेक्शन बंद कर देगा। हमारे पास ऐसे कार्य हैं जो पूर्ण होने में कुछ घंटे लगते हैं।
श्रमिकों के अंत में 60 हल किए गए कनेक्शन से कम मूल्य के लिए BROKER_HEARTBEAT सेट करना। लेकिन हमें ऐसा कोई सेटिंग नहीं मिल रही है जो ग्राहक कनेक्शन को जीवंत रखेगी।
क्या यह सेलरी के साथ लंबे समय तक चलने वाले कार्यों की प्रतीक्षा करने का सही दृष्टिकोण है?
एक वर्कअराउंड जिसे हमने अभी तक परीक्षण नहीं किया है, AsyncResult.wait()
विधि को सफलतापूर्वक समाप्त होने तक याद करना है। उदाहरण के लिए:
async_result = task.delay(params)
while True:
try:
async_result.wait()
break
except IOError:
pass
हम का उपयोग करें:
- RabbitMQ 3.6.5
- अजवाइन 3.1.20
- अजवाइन बैकएंड pyamqp
- अजवाइन परिणाम बैकएंड RPC
मैं यहां एक अंग पर बाहर जा रहा हूं, लेकिन मैं कहूंगा कि आपको खुद को क्लासिक XY समस्या मिली है। बल्ले से बाहर एसिंक काम पर इंतजार करने के घंटों के लिए धागे को निलंबित करने में काफी गंध है। दूसरा और सामान्य मामले में ईएलबी/रूट 53 लाखों और लाखों अनुरोधों को पूरा करने के लिए डिज़ाइन किया गया है। इस विचार को ध्यान में रखते हुए यदि उन्होंने अंत में घंटों तक अपनी सॉकेट खोल दी तो वे बहुत जल्दी से अभिभूत होंगे। मुझे लगता है कि आप पाएंगे कि आप यहां एक ऑक्टोपस के साथ फर्श को फिसल रहे हैं, आपको छोड़ देना होगा और एक एमओपी खरीदना होगा। – nsfyn55