2012-08-28 18 views
12

शायद मैं मूर्खता से सवाल पूछ रहा हूं लेकिन मुझे आगे काम करने से पहले बुनियादी अवधारणाओं के चारों ओर अपने सिर को लपेटने की जरूरत है।सेलेरी - क्या एक ही समय में दो या दो से अधिक श्रमिकों द्वारा खरगोश एमक्यू में एक संदेश खाया जा सकता है?

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

आलेख Ensuring a task is only executed one at a time संसाधित होने पर फ़ीड को लॉक करने के लिए एक मेम्केहाइड-आधारित समाधान सुझाता है।

लेकिन जो मैं समझने की कोशिश कर रहा हूं वह यह है कि मुझे एक ही समय में कई श्रमिकों द्वारा एक खरगोश एमक्यू कतार पर एक संदेश का उपभोग करने के लिए मेमकैच (या कुछ और) का उपयोग करने की आवश्यकता क्यों है। क्या RabbitMQ (या सेलेरी) में कुछ कॉन्फ़िगरेशन परिवर्तन है जो मैं इस लक्ष्य को प्राप्त करने के लिए कर सकता हूं?

+1

संदेशों को लॉक करने और फ़ीड पर लॉक करने की आवश्यकता के बीच एक अंतर है। आपको क्या करने की ज़रूरत है? –

+0

@PlatinumAzure - थोड़ा सा समझाने की देखभाल?मुझे संदेश पर लॉक करने की आवश्यकता है (अगर इसका मतलब है कि यह कई श्रमिकों द्वारा उपभोग नहीं किया जाएगा)। – rubayeet

उत्तर

4

जैसा कि दूसरों ने नोट किया है कि आप सेब और संतरे मिश्रण कर रहे हैं।

एक अजवाइन कार्य और एक एमक्यू संदेश होने के नाते।

आप यह सुनिश्चित कर सकते हैं कि एक ही समय में केवल एक ही कार्यकर्ता द्वारा एक संदेश संसाधित किया जाएगा।

उदाहरण के लिए।

@task(...) 
def my_task(

my_task.apply(1) 

.apply संदेश संदेश ब्रोकर को संदेश भेजता है (खरगोश, redis ...)। फिर संदेश एक कतार में भेजा जाएगा और समय पर एक कार्यकर्ता द्वारा खाया जाएगा। आपको इसके लिए लॉकिंग की आवश्यकता नहीं है, आपके पास यह मुफ्त है :)

सेलेरी कुकबुक पर उदाहरण दिखाता है कि दो संदेशों को कैसे रोकें (my_task.apply (1)) एक ही समय में चलने से, यह कुछ है आपको कार्य के भीतर ही सुनिश्चित करना होगा।

आपको कुछ ऐसी चीजों की आवश्यकता है जो आप पाठ्यक्रम के सभी श्रमिकों (memcached, redis ...) से एक्सेस कर सकें क्योंकि वे विभिन्न मशीनों पर चल रहे हों।

2

उल्लेख किया गया उदाहरण आमतौर पर अन्य लक्ष्य के लिए उपयोग किया जाता है: यह आपको एक ही अर्थ के साथ अलग-अलग संदेशों के साथ काम करने से रोकता है (एक ही संदेश नहीं)। उदाहरण के लिए, मेरे पास दो प्रक्रियाएं हैं: पहला एक यूआरएल कतार में डालता है, और दूसरा - कतार से यूआरएल लेता है और उन्हें लाता है। क्या होगा यदि पहली प्रक्रिया एक यूआरएल को दो बार कतारबद्ध करे (या इससे भी अधिक बार)?

पीएस मैं इस उद्देश्य के लिए Redis स्टोरेज और setnx ऑपरेशन (जो केवल एक बार कुंजी सेट कर सकता है) के लिए उपयोग करता हूं।

5

एक सामान्य एमक्यू संदेश सामान्य उपभोक्ता सेटअप में कई उपभोक्ताओं द्वारा निश्चित रूप से नहीं देखा जाएगा। आपको असफल/दुर्घटनाग्रस्त श्रमिकों, ऑटो-एक्स और संदेश रिजेक्शन पर पढ़ने वाले मामलों के लिए कुछ काम करना होगा, लेकिन मूल मामला ध्वनि है।

मुझे आपके द्वारा लिंक किए गए आलेख में एक सिंक्रनाइज़ कतार (पढ़ें: एमक्यू) नहीं दिखाई देता है, इसलिए (जहां तक ​​मैं कह सकता हूं) वे सिंक्रनाइज़ करने के लिए लॉक तंत्र (पढ़ना: memcache) का उपयोग कर रहे हैं, के रूप में एक विकल्प। और मैं कुछ समस्याओं के बारे में सोच सकता हूं जो उचित एमक्यू सेटअप में नहीं होंगे।