2017-05-11 10 views
5

मैं वर्तमान में RabbitMQClient.dll C# क्लाइंट से EventingBasicConsumer का उपयोग कर रहा हूं, हम उपभोक्ता को दिए गए प्रत्येक संदेश को संभालने के लिए एक अलग थ्रेड उत्पन्न करते हैं।क्लाइंट कनेक्शन को छोड़ देता है जब ग्राहक को संदेश भेजने के लिए 60 सेकंड से अधिक समय लगता है

हमें एक अजीब व्यवहार का सामना करना पड़ा, RabbitMQ सर्वर missed heartbeats from client, timeout: 60s त्रुटि के साथ बार कनेक्शन बंद कर देता है। कुछ क्षण बाद ग्राहक Already closed: The AMQP operation was interrupted: AMQP close-reason, initiated by Library, code=541 कहकर एक त्रुटि रिपोर्ट करता है। मुझे यह त्रुटि client unexpectedly closed TCP connection भी अधिक बार हो रही है।

कुछ स्थितियों में ग्राहकों को एक नौकरी अनुरोध को संसाधित करने में 60 से अधिक सेकंड लग सकते हैं और यह त्रुटि ऐसी स्थितियों के तहत होती है।

क्या यह आवश्यक है कि नौकरी 60 सेकंड के भीतर संसाधित की जाए? क्योंकि हमारी प्रक्रिया के लिए यह 30 सेकंड से 5 मिनट के बीच भिन्न हो सकता है।

RabbitMQ सर्वर: 3.6.6 RabbitMQ.Client.dll (सी # ग्राहक): RabbitMQ.Client.4.1.1

इस मामले की छानबीन किसी भी अंतर्दृष्टि बहुत सराहना कर रहा है।

+1

आप संभवतः 'प्राप्त' हैंडलर के अंदर सभी संदेशों को संभालते हैं, जो गर्मी की धड़कन सहित चैनल (मुझे लगता है) पर हर दूसरी गतिविधि को अवरुद्ध करता है। संदेशों को अतुल्यकालिक रूप से संभालने का प्रयास करें: 'प्राप्त' ईवेंट हैंडलर में उन्हें कुछ कतार (जैसे ConcurrentQueue) में रखा गया है और उस पंक्ति को किसी अन्य थ्रेड में संसाधित करें। जब कुछ संदेश के साथ किया जाता है - चैनल पर एसीके। – Evk

+0

मैं वर्तमान में इस तरह प्रसंस्करण करता हूं, लेकिन यह चैनल को क्यों अवरुद्ध करेगा। मेरे पास 100 का प्रीफेच है और मुझे हैंडलर द्वारा 100 धागे पैदा हुए हैं। मैं खरगोश एमक्यू को सक्रिय रूप से सुनकर एक धागा भी देखता हूं, क्या वह दिल की धड़कन का ख्याल नहीं रखता है? – M22an

+0

ठीक है कि विचार आपके दिमाग में आपके मुद्दे के विवरण से आया, मैंने इसे स्वयं सत्यापित नहीं किया। – Evk

उत्तर

0

आप दोनों कतार प्रति और प्रति संदेश RabbitMQ में टीटीएल टाइमआउट को बढ़ा सकते हैं

IBasicProperties mqProps = model.CreateBasicProperties(); 
mqProps.ContentType = "text/plain"; 
mqProps.DeliveryMode = 2; 
mqProps.Expiration = "300000" 

model.BasicPublish(exchangeName, 
        routingKey, mqProps, 
        messageBodyBytes); 

documentaion है https://www.rabbitmq.com/ttl.html

पर लेकिन मुझे लगता है आप के लिए Async पैटर्न के लिए यह लिख कर बेहतर कर रहे हैं संदेश की वास्तविक प्रसंस्करण।

यह आपको RabbitMQ

साथ async संदेश प्रसंस्करण कर

https://codereview.stackexchange.com/questions/42836/listen-to-multiple-rabbitmq-queue-by-task-and-process-the-message

के लिए और इस प्रश्न में वहाँ काफी जानकारी के आवंटित भी async संदेश की खपत पर कर रहे हैं प्रेरणा दे सकता है।

multi-threading based RabbitMQ consumer

+1

आपकी प्रतिक्रिया के लिए धन्यवाद आर्कलाइट, लेकिन वास्तव में टीटीएल को मेरी मदद करने के लिए बढ़ रहा है? Async पैटर्न मदद कर सकता है, मुझे अभी तक यह सत्यापित करने में सक्षम नहीं है।आपको बताएगा कि यह – M22an

+0

कैसे तत्काल दर्द राहत के लिए टीटीएल को 5 मिनट से अधिक समय तक बढ़ाकर आपको टाइमआउट प्राप्त करने से रोकना चाहिए। लेकिन मैं पूरी तरह से Async – Archlight

+0

का उपयोग करने की अनुशंसा करता हूं क्या दिल की धड़कन अवधि टीटीएल से संबंधित है? मैं देखता हूं कि दिल की धड़कन टाइमआउट बढ़ाने का एक तरीका भी है। लेकिन यह सिर्फ इस मुद्दे को स्थगित कर देगा। – M22an

0

मैं EasyNetQ साथ बहुत लंबे समय तक नौकरियों (मिनट) को चलाने के लिए इस्तेमाल किया। यह अधिक उच्च स्तरीय क्लाइंट है जो RabbitMQ.Client को लपेटता है।

मेरे लिए, इन त्रुटियों का कारण this comment में लिखा गया है। मैं EasyNetQ को आजमाऊंगा क्योंकि likely हैंडलिंग प्रक्रिया से हटाए गए संदेशों को ला रहा है।

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