2016-12-08 8 views
14

के साथ सेलेरी कनेक्शन ड्रॉप हमारे पर्यावरण में, हम कई नोड्स पर समानांतर में कार्यों को चलाने के लिए एडब्ल्यूएस पर खरगोशएमक्यू और सेलेरी का उपयोग करते हैं।एडब्ल्यूएस ईएलबी और खरगोश एमक्यू

हाल ही में हमने खरगोश एमक्यू को 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 

हम का उपयोग करें:

  1. RabbitMQ 3.6.5
  2. अजवाइन 3.1.20
  3. अजवाइन बैकएंड pyamqp
  4. अजवाइन परिणाम बैकएंड RPC
है
+1

मैं यहां एक अंग पर बाहर जा रहा हूं, लेकिन मैं कहूंगा कि आपको खुद को क्लासिक XY समस्या मिली है। बल्ले से बाहर एसिंक काम पर इंतजार करने के घंटों के लिए धागे को निलंबित करने में काफी गंध है। दूसरा और सामान्य मामले में ईएलबी/रूट 53 लाखों और लाखों अनुरोधों को पूरा करने के लिए डिज़ाइन किया गया है। इस विचार को ध्यान में रखते हुए यदि उन्होंने अंत में घंटों तक अपनी सॉकेट खोल दी तो वे बहुत जल्दी से अभिभूत होंगे। मुझे लगता है कि आप पाएंगे कि आप यहां एक ऑक्टोपस के साथ फर्श को फिसल रहे हैं, आपको छोड़ देना होगा और एक एमओपी खरीदना होगा। – nsfyn55

उत्तर

3

मुझे विश्वास है कि आपको क्या करना है एडब्ल्यूएस ई पर टाइमआउट बढ़ाएं LB। क्या हो रहा है कि कार्य पूरा होने से पहले कनेक्शन बंद हो रहा है। आप निम्न आदेश

elb-modify-lb-attributes myTestELB --connection-settings "idletimeout=3600" --headers 

जारी करके इसे पूरा कर सकते हैं यह आपको कार्य को पूरा करने के लिए एक घंटा देगा। इस पर अधिक जानकारी के लिए https://aws.amazon.com/blogs/aws/elb-idle-timeout-control/ देखें।

यदि कोई घंटा पर्याप्त नहीं है तो आपको कनेक्शन पूलिंग अक्षम करनी होगी। इन दो सेटिंग्स को अपने सेलेरी कॉन्फ़िगरेशन

BROKER_POOL_LIMIT = None 
BROKER_TRANSPORT_OPTIONS = {'confirm_publish': True} 

सेकंड में कुछ ओवरहेड जोड़ने के बाद एक प्रदर्शन हिट होगा। चूंकि आपके पास लंबे समय तक चलने वाले कार्य हैं, यह कोई समस्या नहीं हो सकती है। दूसरी सेटिंग आवश्यक नहीं हो सकती है लेकिन मैं यह सलाह दूंगा कि आप लोड बैलेंसर के पीछे हैं। यह सेटिंग सुनिश्चित करेगी कि संदेश प्राप्त हो गए हैं और प्रक्रिया में खो नहीं गए हैं।

एक और विकल्प आपके लंबे कार्य को छोटे कार्यों में भी तोड़ रहा है! इसका मतलब अधिक कोड हो सकता है लेकिन यह लंबे समय तक इसके लायक हो सकता है।

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