2010-12-08 20 views
13

मैं अपने आप को एक ऐसा एप्लिकेशन बनाने के लिए रेल पर जेआरबी 1.5.6 का उपयोग कर रहा हूं जो समय-समय पर जाकर किसी भी आरएसएस पॉडकास्ट को पुनः प्राप्त कर लेगा जिसे मैंने सब्सक्राइब किया है।रेल शेड्यूलिंग विकल्पों पर jruby

मैंने मुख्य रूप से जेआरबीई चुना है क्योंकि मैं जावा से परिचित हूं, रेल फ्रेमवर्क का उपयोग करना चाहता हूं और सबसे महत्वपूर्ण बात यह है कि रूबी मेरी आवश्यकताओं से कम होने पर जावा में "भारी उठाने" कार्यों को करने में सक्षम हूं। अब तक (और मैं अभी भी विकास के शुरुआती चरणों में हूं) यह संकर दृष्टिकोण बहुत अच्छी तरह से काम कर रहा है।

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

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

जवाहरात मैं कोशिश की है में से कुछ ...

Rufus अनुसूचक

इस प्रयोग किया जाता करने के बाद इससे पहले कि मैं यह इंटरफेस और प्रलेखन के साथ खुश हूँ, लेकिन वहाँ डेटाबेस हठ की कमी है, इसलिए मेरी आवश्यकताओं के लिए एक सौदा ब्रेकर।

delayed_job

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

जिथब पर एक कांटा है जिस पर डिमन्स पर निर्भरता नहीं है, हालांकि मैं मुख्य विकास शाखा से एक कांटा में स्विच करने में खुश नहीं हूं और मुझे अभी भी ऑब्जेक्टस्पेस मुद्दे के साथ छोड़ दिया गया है जो मैं अनिश्चित हूं इसके प्रदर्शन प्रभाव के रूप में।

क्वार्ट्ज-JRuby

जबकि वहाँ विभिन्न क्वार्ट्ज आधारित जवाहरात किया गया है से पहले, this very recent offering एक चालाक रूबी की तरह इंटरफेस प्रदान पर एक और प्रयास है। हालांकि न्यूनतम दस्तावेज है और मुझे यकीन है कि यह डेटाबेस समर्थित हो सकता है, मेरी आंत महसूस यह है कि यह नहीं है।

समस्या

जबकि मैं केवल यहाँ 3 विकल्प पर प्रकाश डाला गया है, मुझे पता है दूसरों के लिए उपलब्ध हैं कि हूँ। हालांकि मैं सभी 3 आवश्यकता बक्से (दस्तावेज़, रखरखाव, डेटाबेस समर्थित) पर टिक लगाने का समाधान नहीं ढूंढ पाया है।

तो सवाल कर रहे हैं ...

किसी और को इस स्थिति में किया गया है और एक समाधान के साथ आ गया?

क्या किसी ने भी किसी भी रूप में देरी से काम करने में कामयाब रहे हैं?

क्या वहां कोई बेहतर समाधान है जिसे मैंने अनदेखा कर दिया है और मेरी आवश्यकताओं को पूरा करेगा?

+1

** अपडेट ** मैंने सोचा कि मैंने जेआरबी के साथ उपयोग करने के लिए तय किए गए अंतिम समाधान को पोस्ट करने के लायक है, अब 1.7.2 पर। मेरा वर्तमान सेटअप साइडकीक और क्लॉकवर्क का उपयोग करता है। यह एक विश्वसनीय दीर्घकालिक समाधान साबित हुआ है –

उत्तर

4

हम एक साल से अधिक समय में जेआरबी के तहत देरी_job (collectiveidea/v1.8.4) का उपयोग कर रहे हैं। हमने ऑब्जेक्टस्पेस को सक्षम नहीं किया है और हम डिमन्स मणि का भी उपयोग नहीं करते हैं।

एक सरल रेक कार्य

namespace :product do 
    desc "Start Delayed Job Worker" 
    task :dw => :environment do 
     Delayed::Worker.new.start 
    end 
    end 

बनाया और ओएस निर्भर तरीके से daemonize। लिनक्स पर,

nohup jruby -S rake product:dw > $log_dir/delayed_job_console.log 2>&1 & 
+1

मुझे लगता है कि यह दौड़ने के समान है <रेक नौकरियां: कार्य>, जैसा कि आप देख सकते हैं [..]/रत्न/देरी_job-3.0.3/lib/देरी/कार्य। आरबी -> कार्य: कार्य =>: पर्यावरण विलंब :: कार्यकर्ता.न्यू (: min_priority => ENV ['MIN_PRIORITY'],: max_priority => ENV ['MAX_PRIORITY'],: queues => (ENV ['QUEUES '] || ENV [' QUEUE '] ||' ') .sp lit (', '),: quiet => false) .start –

4

मैं resque कतार प्रणाली के रूप में की सिफारिश करेंगे। Resque DelayedJob के समान है, लेकिन मेरी राय में बहुत बेहतर है। यह developed at GitHub and is used as their queueing system था। मैं इसे लगभग एक साल तक उत्पादन में भी इस्तेमाल कर रहा हूं और मैं इसके साथ बहुत खुश हूं।

रेस्क में निश्चित रूप से जेआरबीई समर्थन है, और आपको निर्धारित समय-सारणी प्राप्त करने के लिए बस इतना करना है कि एक सरल शेड्यूलर हो। कुछ resque-scheduler की सलाह देते हैं, हालांकि मैं इसे सरल रखना और clockwork का उपयोग करना चाहता हूं जिसमें शेड्यूलर को कतारबद्ध करने के लिए सरल क्रॉन-जैसे कार्यों को लिखने के लिए एक अच्छा डीएसएल है (देखें: clockwork README)। कि के साथ, आप बस इतनी तरह बातें निर्धारित कर सकते हैं:

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) } 
2

चेक https://github.com/kares/jruby-rack-worker यह JRuby वातावरण के अंतर्गत समाधान delayed_job अनुमति देता है। अभी भी प्रगति पर काम करते हैं। लेखन के समय, मेरा अनुभव यह है कि यह एक कार्यकर्ता के साथ ठीक काम करता है। हालांकि मुझे अतिरिक्त श्रमिकों को चलाने में कठिनाइयां हैं।

+0

ठीक काम कर रहा था, लेकिन फिर यह हर बार बंद हो जाता है। क्या तुम्हारे पास कोई विचार है? –

1

मैंने मूल रूप से दिसंबर 10 में इस प्रश्न से पूछा और तब से एक समाधान विकसित किया है जिसे मैंने सोचा था कि दूसरों के संदर्भ में वापस पोस्ट करना उचित होगा।

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

परिणाम acts_as_executor है जो रेलवे 3.x एप्लिकेशन को निष्पादकों और कार्यों (जो उचित जावा थ्रेड में चलाएगा) के साथ बातचीत करने की अनुमति देता है जैसे कि यह कोई अन्य ActiveRecord मॉडल होगा।

मैंने हाल ही में उम्मीदवार को रिहा करने के लिए मणि स्थानांतरित कर दिया है। GitHub और Rubygems पर एक नज़र डालें।

एनबी। RubyGems डिफ़ॉल्ट पृष्ठ अभी भी किसी कारण से बीटा 2 दिखाता है। हालांकि आरसी 1 अभी भी नवीनतम रिलीज है।

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