2015-05-16 10 views
8

मुझे आश्चर्य है कि क्या सेबरी के साथ काम करने के लिए खरगोश एमक्यू या रेडिस स्थापित करने का कोई तरीका है ताकि जब मैं कतार में कोई कार्य भेजूं, तो यह नहीं जाता कार्यों की एक सूची में, बल्कि डुप्लिकेट से बचने के लिए, मेरे कार्य के पेलोड के आधार पर की गई कार्यों के सेट में।वितरित कार्य कतार सूची के आधार पर डेटा संरचना के रूप में सेट पर आधारित

यहां अधिक संदर्भ के लिए मेरा सेटअप है: पायथन + सेलेरी। मैंने रैबिटएमक्यू को बैकएंड के रूप में आजमाया है, अब मैं रेडिस को बैकएंड के रूप में उपयोग कर रहा हूं क्योंकि मुझे 100% विश्वसनीयता, उपयोग करने में आसान, छोटी मेमोरी पदचिह्न इत्यादि की आवश्यकता नहीं है

मेरे पास लगभग 1000 आईडी हैं जिनकी आवश्यकता है काम बार-बार किया जाता है। मेरी डेटा पाइपलाइन का चरण 1 शेड्यूलर द्वारा ट्रिगर किया जाता है और यह चरण 2 के लिए कार्यों को आउटपुट करता है। कार्यों में केवल आईडी होती है जिसके लिए काम करने की आवश्यकता होती है और वास्तविक डेटा डेटाबेस में संग्रहीत होता है। मैं बिना किसी हानि के चरण 1 और चरण 2 कार्यों के किसी भी संयोजन या अनुक्रम चला सकता हूं।

यदि चरण 2 में चरण 1 द्वारा कार्य आउटपुट की मात्रा से निपटने के लिए पर्याप्त प्रसंस्करण शक्ति नहीं है, तो मेरा कार्य कतार बढ़ता और बढ़ता है। यदि कार्य कतार का उपयोग सूचियों के बजाय अंतर्निहित डेटा संरचना के रूप में सेट किया जाता है तो यह मामला नहीं होना चाहिए।

क्या सूचियों से स्विच करने के लिए वितरित कार्य कतार के रूप में सेट करने के लिए एक ऑफ-द-शेल्फ समाधान है? क्या सेलेरी इस में सक्षम है? मैंने हाल ही में देखा है कि रेडिस ने अभी कतार प्रणाली का अल्फा संस्करण जारी किया है, इसलिए यह अभी तक उत्पादन के उपयोग के लिए तैयार नहीं है।

क्या मुझे अपनी पाइपलाइन को अलग-अलग आर्किटेक्ट करना चाहिए?

+1

खरगोश एमक्यू के साथ आप 1 के अधिकतम कतार गहराई ('x-max-length') के साथ प्रत्येक अद्वितीय आईडी के लिए एक कतार बना सकते हैं। 1000 अलग-अलग कतारों को प्रकाशित करने और सदस्यता लेने की अतिरिक्त हाउसकीपिंग है, लेकिन आपको आवश्यकता होने पर डुप्लिकेट छोड़ दिया जाएगा। – tariksbl

+0

यह वास्तव में कामकाजी प्रकार का तर्क है जिसे मैं ढूंढ रहा हूं, लेकिन यह विशेष समाधान थकाऊ लगता है और मैं भी आगे बढ़ने वाले खरगोश एमक्यू से दूर रहना पसंद करूंगा। हालांकि, रचनात्मकता के लिए धन्यवाद! – Heliodor

उत्तर

1

क्या चरण 2 में आपके कार्य जांच सकते हैं कि क्या काम पहले से ही किया जा चुका है और यदि यह है, तो फिर से काम नहीं करते? इस तरह, भले ही आपकी कार्य सूची बढ़ेगी, आपको जिस काम की आवश्यकता है, वह नहीं होगी।

मैं सेट/सूचियों के समाधान में नहीं आया हूं, और मुझे लगता है कि इस मुद्दे को हल करने के कई अन्य तरीके थे।

+0

कार्य कतार का आकार ही समस्या है। क्यूइंग के लिए आपके समाधान के रूप में आप किस सॉफ्टवेयर का उपयोग करते हैं, इस पर निर्भर करते हुए, आप या तो स्मृति लेते हैं या डेटाबेस में स्थान लेते हैं। उनमें से कोई भी वांछनीय नहीं है। मैं एक अच्छी तरह से व्यवहार प्रणाली पसंद करेंगे। – Heliodor

+0

ठीक है, मैं देखता हूं। संभवतया यदि आपके पास सेट का उपयोग करके समाधान हो, तो आप पहले से ही काम पूरा कर रहे होंगे? मुझे आश्चर्य है कि अगर कहीं भी काम किया गया है या काम करने की योजना है, और उस सूची में केवल कतार में कार्य जोड़ रहा है, तो यह उस सूची में नहीं है। – Maximilian

-1

अपनी नौकरियों की कतार के लिए रेडिस के भीतर सॉर्टेडसेट का उपयोग करें। यह वास्तव में एक सेट है इसलिए यदि आप इसके अंदर एक ही डेटा डालते हैं तो इसमें कोई नया मूल्य नहीं जोड़ा जाएगा (इसे बिल्कुल सटीक डेटा होना चाहिए, आप Redis में सॉर्टेडसेट में उपयोग किए गए हैश फ़ंक्शन को ओवरराइड नहीं कर सकते हैं)।

आपको सॉर्टेडसेट के साथ उपयोग करने के लिए एक स्कोर की आवश्यकता होगी, आप एक टाइमस्टैम्प (उदाहरण के लिए यूनिट का उपयोग करके डबल के रूप में मूल्य) का उपयोग कर सकते हैं जो आपको सबसे हालिया आइटम/सबसे पुराना आइटम प्राप्त करने की अनुमति देगा। ZRANGEBYSCORE शायद वह आदेश है जिसे आप ढूंढ रहे हैं। http://redis.io/commands/zrangebyscore

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

+0

डाउनवॉटेड। ओपी पहले से ही जानता है कि सेट या सॉर्ट किए गए सेट समस्याएं हल करेंगे। ओपी क्या पूछ रहा है कि क्रमबद्ध सेट/सेट सेलेरी में आसानी से प्लग करने योग्य है या नहीं। – DhruvPathak

2

आप वर्तमान स्थिति को स्टोर और मॉनीटर करने के लिए बाहरी डेटा संरचना का उपयोग कर सकते हैं आपकी अजवाइन कतार 1. उदाहरण के लिए एक लाल रंग की कुंजी-मान लें। जब भी आप एक कार्य को अजवाइन में डालते हैं, तो आप अपने 'आईडी' फ़ील्ड के साथ एक कुंजी को रेडिस में सत्य के रूप में चिह्नित करते हैं।

  1. किसी भी 'आईडी' के साथ एक नया कार्य पुश करने के लिए कोशिश कर रहा से पहले, आप अगर 'आईडी' के साथ कुंजी redis में सच है या नहीं, यदि हां, तो आप को आगे बढ़ाने को छोड़ जाँच करेगा काम।

  2. उचित समय पर चाबियाँ साफ़ करने के लिए, आप after_return सेलेरी के हैंडलर का उपयोग कर सकते हैं, जो कार्य वापस लौटने पर चलता है।यह हैंडलर लाल 'में' आईडी 'को अनसेट करेगा, इसलिए अगले कार्य धक्का के लिए लॉक को साफ़ कर देगा।

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

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