2012-01-15 18 views
12

क्या कोई मुझे मार्गदर्शन कर सकता है कि गियरमैन रीट्रीज़ करता है जब अपवाद फेंक दिया जाता है या जब त्रुटियां होती हैं?गियरमैन में त्रुटि की स्थिति और रीट्रीज़?

मैं एक Django ऐप में पाइथन गियरमैन क्लाइंट का उपयोग करता हूं और मेरे कर्मचारी को Django कमांड के रूप में शुरू किया जाता है। मैंने इस blog post से पढ़ा है जो त्रुटि शर्तों से को सीधे आगे नहीं बढ़ाता है और इसे कार्यकर्ता पक्ष से sys.exit की आवश्यकता होती है।

क्या इसे शायद भेजने या भेजने के लिए पुनः प्रयास करने के लिए तय किया गया है? एक्सपोनेंशियल्स एल्गोरिदम के साथ गियरमैन सपोर्ट रीट्रीज़ भी करता है - कहें कि एक एसएमटीपी विफलता 2,4,8,16 सेकेंड आदि के बाद इसकी रीट्रीज़ होती है?

+0

sys.exit() गियरमैन के साथ एक बुरा विचार है - आम तौर पर यह हमेशा के लिए ऐसी कोई नौकरी फिर से प्रयास करेगा (जब तक कि आपके पास डेमन स्टार्टअप पर जॉब-रेट्री सेट न हो)। नौकरी से किसी भी स्थिति/परिणामों के साथ बस 'वापसी स्ट्रिंगवर' करें (उदाहरण के लिए वास्तविक जानकारी के साथ डीबी पंक्ति या कैश में कुंजी।) – RichVel

उत्तर

25

मेरी समझ के लिए, गियरमैन बहुत "यह मेरा व्यवसाय नहीं है" दृष्टिकोण का उपयोग करता है - उदाहरण के लिए, जब तक मजदूरों को दुर्घटनाग्रस्त नहीं किया जाता है, तब तक यह नौकरियों के साथ हस्तक्षेप नहीं करता है। किसी भी सफलता/विफलता संदेशों को क्लाइंट द्वारा संभाला जाना चाहिए, न कि गियरमैन सर्वर स्वयं।

अग्रभूमि नौकरियों में, यह मतलब है कि सभी sendFail()/sendException() और अन्य send*() ग्राहक के लिए निर्देशित किया गया है और यह काम पुनः प्रयास करें या नहीं करने के लिए तय करने के लिए ग्राहक के लिए है। यह समझ में आता है क्योंकि कभी-कभी आपको पुनः प्रयास करने की आवश्यकता नहीं होती है।

पृष्ठभूमि नौकरियों में, सभी send*() फ़ंक्शंस अपना अर्थ खो देते हैं, क्योंकि कोई क्लाइंट नहीं है जो कॉलबैक सुन रहा होगा। नतीजतन, भेजे गए संदेश सिर्फ गियरमैन द्वारा अनदेखा किए जाएंगे। एकमात्र शर्त जिस पर नौकरी की पुन: प्रयास की जाएगी, जब कर्मचारी क्रैश हो जाता है (जो exit(XX) कमांड के साथ अनुकरण करके कर सकता है, जहां XX एक गैर-शून्य मान है)। यह, ज़ाहिर है, ऐसा कुछ नहीं है जिसे आप करना चाहते हैं, क्योंकि श्रमिकों को आम तौर पर लंबी चल रही प्रक्रियाएं माना जाता है, न कि उन सभी को जो असफल नौकरी के बाद पुनरारंभ करना होता है।

व्यक्तिगत रूप से, मैंने डिफ़ॉल्ट गियरमैनजोब क्लास को विस्तारित करके इस समस्या को हल किया है, जहां मैं send*() फ़ंक्शन पर कॉल को रोकता हूं और फिर पुनः प्रयास तंत्र को कार्यान्वित करता हूं। अनिवार्य रूप से, मैं एक वर्कलोड के साथ सभी पुनः प्रयास-संबंधित डेटा (रीट्रीज़ की अधिकतम संख्या, पहले से ही पुनः प्रयास किया गया) पास करता हूं और फिर सब कुछ संभालता हूं। यह थोड़ा बोझिल है, लेकिन मुझे समझ में आता है कि गियरमैन इस तरह क्यों काम करता है - यह आपको सभी एप्लिकेशन तर्कों को संभालने की अनुमति देता है।

अंत में, घातीय समय समाप्ति (या उस मामले के लिए किसी भी समय समाप्ति) के साथ नौकरियों को पुनः प्रयास करने की क्षमता के संबंध में। गियरमैन में देरी की नौकरियां जोड़ने की सुविधा है (protocol documentation में देखें), फिर भी मुझे इसकी स्थिति के बारे में निश्चित नहीं है - PHP एक्सटेंशन और, मुझे लगता है कि पाइथन मॉड्यूल इसका समर्थन नहीं करता है और दस्तावेज़ कहते हैं कि इसे हटाया जा सकता है भविष्य। लेकिन मुझे लगता है कि यह इस समय काम करता है - आपको इसे करने के लिए गियरमैन को कच्चे सॉकेट अनुरोध जमा करने की आवश्यकता है (और घातीय भाग भी आपकी तरफ लागू किया जाना चाहिए)।

हालांकि, this blog post का तर्क है कि SUBMIT_JOB_EPOCH कार्यान्वयन अच्छी तरह से स्केल नहीं करता है। वह काम करने के लिए node.js और setTimeout() का उपयोग करता है, मैंने दूसरों को ऐसा करने के लिए यूनिक्स उपयोगिता at का उपयोग किया है। किसी भी तरह से - गियरमैन यह आपके लिए नहीं करेगा। यह विश्वसनीयता पर ध्यान केंद्रित करेगा, लेकिन आपको सभी तर्कों पर ध्यान केंद्रित करने देगा।

+5

मुझे पता है कि यह एक पुराने प्रश्न का उत्तर है, लेकिन मैंने देखा है कि कई लोग संघर्ष कर रहे हैं एक ही मुद्दा और मेरा मानना ​​है कि यह एक बार और सभी के लिए पूरी तस्वीर प्रदान करने लायक है। – Aurimas