2010-09-21 10 views
12

मुझे खरगोश एमक्यू पर नौकरी कतार की तरह कुछ मिला है और, नौकरी रद्द करने के अनुरोध पर, मैं उन कार्यों को वापस लेना चाहता हूं जिन्होंने अभी तक प्रसंस्करण शुरू नहीं किया है (उनके संदेश अमान्य नहीं हैं), जो मेल खाता है इन संदेशों को उन कतारों से वापस लेने के लिए जिन्हें वे रूट कर चुके हैं।RabbitMQ में एक संदेश कैसे निकालें?

मुझे यह कार्यक्षमता AMQP या RabbitMQ API में नहीं मिली है; शायद मैंने काफी अच्छी तरह से खोज नहीं की है? या मुझे एक वर्कअराउंड का उपयोग करना होगा (यह मुश्किल नहीं है, लेकिन फिर भी)? अपने लक्ष्य को प्राप्त करने के

उत्तर

2

कम से कम दो तरीके:

  • basic.reject संदेश requeue अगर requeue=true सेट किया गया है (अन्यथा यह संदेश को अस्वीकार कर देंगे) होगा।
    (RabbitMQ 2.0.0 के बाद से समर्थित; http://www.rabbitmq.com/blog/2010/08/03/well-ill-let-you-go-basicreject-in-rabbitmq/ देखें)।

  • basic.recover ब्रोकर से चैनल पर अनचाहे संदेशों को फिर से वितरित करने के लिए कहेंगे।

+2

नहीं, यह एक अलग समस्या हल करता है। मुझे उपभोक्ता पक्ष में एक संदेश को खारिज करने की आवश्यकता नहीं है, मैं निर्माता पक्ष से अपनी डिलीवरी रद्द करना चाहता हूं, ताकि संदेश उपभोक्ता तक नहीं पहुंच सके जैसे कि यह कभी अस्तित्व में नहीं था। मेरी समस्या में, उपभोक्ता यह तय नहीं कर सकता कि कोई संदेश खारिज कर दिया जाना चाहिए या नहीं। – jkff

+4

यदि संदेश सफलतापूर्वक प्रकाशित होते हैं और आपको उन्हें ज्ञात कतार से निकालना होगा, तो इसे छोड़ दें और उन्हें निर्माता में उपभोग करें। –

4

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

कम मात्रा के लिए, आप प्रति नौकरी के साथ एक कतार के साथ इसे जोड़ सकते हैं। कतार बनाएं, कतार में नौकरी का विवरण पोस्ट करें, श्रमिकों को कतार का नाम घोषित करें। यदि संसाधित होने से पहले नौकरी को रद्द करने की आवश्यकता है, तो नौकरी की कतार हटा दी गई है; जब श्रमिक नौकरी के विवरण लाने के लिए आते हैं, तो वे देखेंगे कि कतार गायब हो गई है।

लाइटरवेट और आम तौर पर नौकरी की स्थिति को पकड़ने के लिए रेडिस या किसी अन्य कुंजी/मूल्य स्टोर का उपयोग करना होगा (हटाए गए या अनुपस्थित रिकॉर्ड के साथ रद्द या अनुपयुक्त नौकरी के साथ) और खरगोश का उपयोग नए/हटाए गए/बदले जाने के बारे में सूचित करने के लिए कुंजी/मूल्य स्टोर में रिकॉर्ड।

1

आपको उन सभी कतारों की सदस्यता लेने की आवश्यकता है जिनके संदेश भेजे गए हैं, और उन्हें एके के साथ उपभोग करें।

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

एक विकल्प, चूंकि आप RabbitMQ का उपयोग कर रहे हैं, एक कस्टम एक्सचेंज प्लगइन लिखना है जो सभी कतारों को साफ़ करने के लिए बैंड निर्देश से कुछ स्वीकार करेगा। उदाहरण के लिए आप उस एक्सचेंज को एक विशेष संदेश हेडर पढ़ सकते हैं जो यह बताता है कि यह संदेश उन सभी कतारों को साफ़ करने के लिए कहता है जिनके लिए यह संदेश नियत है। इसके लिए एरलांग कोड लिखने की आवश्यकता है, लेकिन 4 अलग-अलग विनिमय प्रकार लागू किए गए हैं, इसलिए आपको केवल सबसे समान प्रतिलिपि बनाने और नए बाहवीरों के लिए कोड लिखने की आवश्यकता होगी। यदि आप केवल इसके लिए कस्टम हेडर का उपयोग करते हैं, तो संदेश का मुख्य भाग उपभोक्ताओं के लिए एक सामान्य संदेश हो सकता है।

सारांश में:

1) प्रकाशक संदेशों खुद 2) का उपभोग करने की जरूरत है प्रकाशक एक विशेष कतार संदेश 3 अनदेखी करने के लिए उपभोक्ताओं को बताने के लिए) प्रकाशक भेज सकते हैं में एक विशेष संदेश भेज सकते हैं एक कस्टम एक्सचेंज के लिए एक विशेष संदेश जो उपभोक्ताओं को यह विशेष संदेश भेजने से पहले कतारों से किसी भी मौजूदा संदेश को साफ़ करेगा।

7

मैं इस परिदृश्य को हल कर दूंगा कि कार्यकर्ता किसी प्रकार का आधिकारिक डेटा स्रोत जांच कर यह निर्धारित कर सके कि नौकरी आगे बढ़नी चाहिए या नहीं। उदाहरण के लिए, कर्मचारी यह देखने के लिए डेटाबेस में नौकरी की स्थिति की जांच करेगा कि क्या नौकरी पहले ही रद्द कर दी गई थी या नहीं।

परिदृश्यों के लिए जहां प्रसंस्करण नौकरियों की गति गति से तेज़ी से हो सकती है जिसके साथ आधिकारिक स्टोर को अद्यतन और पढ़ा जा सकता है, कम गारंटीकृत डेटा स्टोर जो अन्य विशेषताओं के लिए गति का व्यापार उपयोगी हो सकता है।

इसका एक उदाहरण रेडिस को माइस्क्लुएल जैसे रिलेशनल डीबी के बजाय संदेश की प्रोसेसिंग रद्द करने के लिए स्टोर के रूप में उपयोग करना होगा। रेडिस बहुत तेज है, लेकिन इसके डेटा के संबंध में कम गारंटी देता है, जबकि MySQL बहुत धीमी है, लेकिन इसके डेटा के बारे में अधिक गारंटी देता है।

अंत में, किसी संदेश को संसाधित करने के लिए किसी अन्य स्रोत के साथ जांच करने की अवधारणा समान है, लेकिन जिस तरह से आप इसे लागू करते हैं, वह आपके विशेष परिदृश्य पर निर्भर करता है।

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