अपने आवेदन के निर्माता मॉड्यूल जो काम प्रस्तुत करना चाहते हैं एक छोटे समूह पर किया जा करने के लिए उपयोगकर्ताओं द्वारा चलाया जाता है। यह जेएसओएन फॉर्म में सदस्यता को RabbitMQ संदेश ब्रोकर के माध्यम से भेजता है।सबसे अच्छा पैटर्न अजगर, पिका और AMQP का उपयोग कर एक अतुल्यकालिक आरपीसी आवेदन डिजाइन करने के लिए क्या है?
मैं कई रणनीतियों की कोशिश की है, और सबसे अच्छा अब तक निम्नलिखित है, जो अभी भी पूरी तरह काम नहीं कर रहा है:
प्रत्येक क्लस्टर मशीन एक उपभोक्ता मॉड्यूल है, जो खुद AMQP कतार और मुद्दों पर एक का सदस्य बनता चलाता है ब्रोकर को बताने के लिए prefetch_count एक बार में कितने कार्य चला सकते हैं।
मैं इसे Pika AMQP लाइब्रेरी से SelectConnection का उपयोग करके काम करने में सक्षम था। उपभोक्ता और निर्माता दोनों चैनल दो चैनल शुरू करते हैं, जो प्रत्येक कतार से जुड़ा होता है। निर्माता चैनल [एक] पर चैनल पर अनुरोधों के लिए चैनल में प्रतिक्रिया के लिए और अनुरोधों प्रतीक्षा करता है [बी], और उपभोक्ता प्रतीक्षा करता है भेजता है [एक] और चैनल पर प्रतिसाद भेजें [बी]। ऐसा लगता है कि, जब उपभोक्ता कॉलबैक चलाता है जो प्रतिक्रिया की गणना करता है, तो यह ब्लॉक करता है, इसलिए प्रत्येक बार प्रत्येक उपभोक्ता में मेरे पास केवल एक ही कार्य निष्पादित होता है।
क्या मैं अंत में की जरूरत है:
- उपभोक्ता [एक] अपने कार्यों सब्सक्राइब (5k हर बार के आसपास) क्लस्टर
- दलाल प्रत्येक उपभोक्ता है, जहां एन के लिए एन संदेश/अनुरोध डिस्पैच करने के लिए समवर्ती कार्यों की संख्या यह
- संभाल कर सकते हैं जब एक ही कार्य समाप्त हो गया है है, उपभोक्ता परिणाम
- निर्माता, उत्तर प्राप्त करता है और गणना स्थिति अद्यतन, अंत में प्रिंट के साथ दलाल/निर्माता करने के लिए उत्तर कुछ रिपोर्ट
प्रतिबंध:
- किसी अन्य उपयोगकर्ता काम प्रस्तुत करते हैं, तो उसके कार्यों के सभी पिछले उपयोगकर्ता (मुझे लगता है कि इस कतार सिस्टम से स्वचालित रूप से सही है, लेकिन मैंने सोचा नहीं किया है के बाद पंक्ति में लग जाएँगे एक पिरोया पर्यावरण पर प्रभाव)
- कार्य एक आदेश प्रस्तुत किया जाना है, लेकिन क्रम में वे उत्तर दिया रहे हैं के बारे में महत्वपूर्ण नहीं है
उत्तर प्रदेश दिनांक
मैंने थोड़ा आगे अध्ययन किया है और मेरी वास्तविक समस्या यह प्रतीत होती है कि मैं एक साधारण कार्य का उपयोग करता हूं जो कि पिका के SelectConnection.channel.basic_consume() फ़ंक्शन पर कॉलबैक के रूप में होता है। मेरा आखिरी (अनुपूरक) विचार नियमित रूप से एक थ्रेडिंग फ़ंक्शन को पास करना है, इसलिए कॉलबैक अवरुद्ध नहीं होगा और उपभोक्ता सुन सकता है।
समस्या जो मैं मिलती हूं उससे बहुत समान है! अजवाइन का उल्लेख करने के लिए –