2012-12-15 17 views
6

में गिराए गए संदेशों का पता लगाएं क्योंकि अंतर्निहित ज़ीरोएमक्यू कतार/बफर सॉकेट की जांच/निरीक्षण करने के लिए यह संभव नहीं लगता है कि उनका उपयोग कितना उपयोग किया जाता है, क्या यह पता लगाने का कोई तरीका है कि संदेश कब पूर्ण हो जाता है भेजे गए/कतार में एक प्रकाशक सॉकेट में बफर?ज़ीरोएमक्यू क्यूई

उदाहरण के लिए, यदि प्रकाशक कतार पूर्ण है, तो zmq_send ऑपरेशन बस संदेश छोड़ देगा।

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

+0

एक बहुत अच्छी फ़ीड है जो उत्तर देती है: जेरोमैक सॉकेट ड्रॉप या संदेश देने में असफल होने के तहत क्या परिस्थितियों में? : http://stackoverflow.com/questions/9909909/under-what-circumstances-do-zeromq-sockets-drop-or-fail-to-deliver-messages शायद यह – eMarine

उत्तर

6

ZeroMQ मार्गदर्शिका में यह के लिए एक उदाहरण (आप पढ़ सकते हैं और पचाने चाहिए जो आप खुशी से 0MQ उपयोग करना चाहते हैं) नहीं है: http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

तंत्र है के रूप में आप अपने आप को उत्तर दिया, में एक दृश्य नंबर जोड़ने के लिए संदेश, और ग्राहक को अंतराल का पता लगाने और उचित कार्रवाई करने की अनुमति दें। अधिकांश पबब परिदृश्यों के लिए आप डिफ़ॉल्ट एचडब्लूएम बढ़ा सकते हैं, जो कि 1000 है, कुछ ज्यादा है; यह आपके औसत संदेश आकार पर निर्भर करता है।

+0

आरआईपी पीटर के लिए दिलचस्प है। लेकिन यह जवाब अस्वीकार्य है। ZMQ हमें यह जांचने का एक तरीका देना चाहिए कि कोई संदेश भेजा गया था या नहीं। – James

1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन हाल ही में एक ही मुद्दे का सामना करते समय मैंने यही किया।

मैं एक DEALER/ROUTER का उपयोग करने का विकल्प चुना और 1. ZMQ_SNDHWM विकल्प सेट इसके अलावा, मैं प्रत्येक zmq_send() पर टाइमआउट पैरामीटर प्रदान की है। आपके परिदृश्य (स्थानीय या दूरस्थ प्रेषण) के आधार पर, टाइमआउट 10 एमएस से 3 सेकंड के बीच कुछ भी हो सकता है।

यदि संदेश टाइमआउट के भीतर नहीं भेजा गया है या प्रेषक-बफर भरा हुआ है zmq_send() झूठी वापसी करेगा। इससे मुझे zmq के सामने एक पुनः प्रयास कतार स्थापित करने में सक्षम बनाया गया। मुझे पता है कि यह एक आदर्श समाधान नहीं है लेकिन मेरे लिए यह ठीक काम करता है। मुझे क्या पहेली है हालांकि DEALER -socket zmq_send() द्वारा वास्तविक/झूठी वापसी का अर्थ है। मैं उस प्रश्न का उत्तर नहीं ढूंढ पा रहा हूं। चाहे यह इंगित करता है कि संदेश buffered किया गया है या संदेश ROUTER पर वितरित किया गया है मुझे दूर कर दिया है। मेरे मामले में मुझे वैसे भी परिणाम मिल गए।

सिर्फ रिकॉर्ड के लिए यह netmq का उपयोग करके किया गया था लेकिन मुझे लगता है कि यह ज़ीरोएमक्यू पर भी लागू होता है।

हालांकि मैं jt सहमत हूं। ज़ीरोएमक्यू (और नेटएमक्यू) को कतार का निरीक्षण करने के लिए कम से कम एक तरीका प्रदान करना चाहिए (और संदेश प्राप्त करना) और संदेशों को छोड़ने के लिए विभिन्न सॉकेट को बताने का एक तरीका भी प्रदान करना चाहिए। सबसे अच्छा विकल्प किसी प्रकार की डेडलेटर कतार में कॉन्फ़िगर किए गए विकल्पों के अनुसार समय पर फैशन में वितरित संदेश भेजने के लिए होगा। तब डेडलेटर कतार को अलग से संभाला जा सकता था।

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