2009-07-09 19 views
15

मेरे पास अक्सर कुछ कोड होता है जिसे किसी शेड्यूल पर या कुछ पैरामीटर के साथ पृष्ठभूमि प्रक्रिया के रूप में चलाया जाना चाहिए। आम तत्व यह है कि वे प्रेषण प्रक्रिया के बाहर चलाए जाते हैं, लेकिन रेल पर्यावरण (और संभावित रूप से पारित पैरामीटर) तक पहुंच की आवश्यकता होती है।रेल में कार्यकर्ता प्रक्रियाओं को व्यवस्थित करने का सबसे अच्छा तरीका क्या है?

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

उत्तर

5

मेरे लिए, बहुत से अतिरिक्त बुनियादी ढांचे को बनाए रखने की इच्छा नहीं है, इसलिए मैंने डेटाबेस की समर्थित कतारों का उपयोग रेल के बाहर चलाया है।

मेरे मामले में, मैंने background_job और delayed_job का उपयोग किया है। background_job के साथ, कार्यकर्ता क्रॉन के माध्यम से चल रहा था, इसलिए कोई डेमॉन प्रबंधन नहीं था। delayed_job के साथ, मैं हेरोकू का उपयोग कर रहा हूं और उन्हें इसके बारे में चिंता करने देता हूं।

देरी_job के साथ आप अपने पृष्ठभूमि कार्यकर्ता को चलाने की आवश्यकता के रूप में कई तर्कों में प्रवेश कर सकते हैं।

Delayed::Job.enqueue(MyJob.new(param[:one], param[:two], param[:three]) 

मैं क्रॉन के माध्यम से script/runner का उपयोग करने से एक तरफ एक समय पर सामान चल रहा है, के लिए एक अच्छा समाधान नहीं मिला है (मैं एक रैक कार्य से अधिक script/runner उपयोग करने के लिए है क्योंकि मैं यह आसान कोड का परीक्षण करने में पसंद करते हैं)।

मुझे नियमित रूप से निर्धारित पृष्ठभूमि प्रक्रिया नहीं होती है जिसके लिए किसी विशेष रेल अनुरोध के लिए उपयोग की आवश्यकता होती है ताकि कोई समस्या न हो।

मुझे पता है कि अन्य सुविधाओं के साथ अन्य कूलर सिस्टम हैं, लेकिन यह मेरे लिए ठीक काम करता है, और मुझे प्रबंधित करने के लिए कई नई सेवाओं को स्थापित करने से निपटने में मदद करता है।

+0

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

2

मेरे पास एक प्रणाली है जो अनुरोध प्राप्त करती है और फिर वेब-सेवाओं का उपयोग करके कई बाहरी प्रणालियों को कॉल करने की आवश्यकता होती है। इन अनुरोधों में से कुछ अनुरोधों को लंबे समय तक लेते हैं, उपयोगकर्ता से प्रतीक्षा करने की उम्मीद की जा सकती है और मैं इन अनुरोधों को संभालने के लिए एंटरप्राइज़ क्यूइंग सिस्टम (activemq) का उपयोग करता हूं।

मैं ऐसा करने के लिए ActiveMessaging प्लगइन का उपयोग कर रहा हूं। यह मुझे अनुरोध डेटा को मार्शल करने और अनुरोध डेटा तक पहुंच के साथ एसिंक्रोनस प्रोसेसिंग के लिए कतार पर रखने की अनुमति देता है, हालांकि यदि आप प्रतिक्रिया के लिए प्रतीक्षा करना चाहते हैं तो आपको एक मतदान सेवा लिखनी होगी।

मैंने Starling and Workling पर रयान बेट्स रेलवेकास्ट देखा है और वे आशाजनक लग रहे हैं लेकिन मैंने उनका उपयोग नहीं किया है।

0

नियमित रूप से निर्धारित कार्यों के लिए, मैं केवल रेक कार्यों का उपयोग करता हूं। यह रेल पर्यावरण के साथ आसानी से, आसानी से परीक्षण, आसानी से समझा और एकीकृत करता है। फिर इन राक कार्यों को क्रॉन जॉब के साथ निष्पादित करें जो आपको आवश्यक अंतराल पर (मैं इन नौकरियों को प्रबंधित करने के लिए whenever का उपयोग करता हूं क्योंकि मैं थोड़ा क्रॉन-अशिक्षित हूं)।

6

मुझे वास्तव में delayed_job और background_job जैसे रत्न पसंद नहीं हैं जो असीमित नौकरियों को चलाने के उद्देश्य से डेटाबेस तक बने रहते हैं। यह सिर्फ मेरे लिए गंदा लगता है। क्षणिक सामान डेटाबेस में नहीं है।

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

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

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

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

एक चीज जो मुझे क्रॉन + रेक के बारे में पसंद नहीं है वह यह है कि रेक को मानक आउटपुट पर प्रिंट करने की वस्तुतः गारंटी दी जाती है, और यदि क्रॉन नौकरियां उत्पादन का उत्पादन करती हैं तो क्रॉन अत्यधिक चिपचिपा होता है। मैं अपने सभी क्रॉन कार्यों को एक उचित नामित निर्देशिका में रखना चाहता हूं, फिर एक रेक कार्य करें जो उन्हें लपेटता है, ताकि उन्हें मैन्युअल रूप से चलाने के लिए तुच्छ हो। यह एक शर्म की बात है कि रेक यह करता है, क्योंकि मैं वास्तव में निर्भरताओं का लाभ उठाने का विकल्प चुनना चाहता हूं। किसी भी मामले में, आप क्रॉन के माध्यम से उन्हें चलाने के बजाए सीधे स्क्रिप्ट पर क्रॉन को इंगित करते हैं।

मैं वर्तमान में एक वेब ऐप बनाने के बीच में हूं जो असीमित प्रक्रियाओं पर भारी निर्भर करता है, और मुझे कहना है, मैं बहुत खुश हूं कि मैंने रेल का उपयोग न करने का फैसला किया।

+0

जिज्ञासा से, आपने क्या उपयोग करने का फैसला किया? –

+0

सिनात्रा, डेटामैपर, एक्सपियन, खरगोश एमक्यू –

+0

ऐसा लगता है कि आपने या तो आर्किटेक्चर पर अधिक समय बिताया है, जितना अधिक इच्छुक होगा, या सामान्य एप्लिकेशन की तुलना में काफी जटिल होगा। विचार? –

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

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