2012-04-16 14 views
12

मैं उच्च उपलब्धता के साथ एक "स्टेलेबल" प्रतिस्थापन की तलाश में हूं। इसे रनटाइम पर नौकरियों को जोड़ने और हटाने का समर्थन करना चाहिए।एक स्केलेबल "एट" कार्यान्वयन के लिए खोज रहे हैं

कुछ पृष्ठभूमि: मेरे पास एक ऐसा एप्लिकेशन है जहां मैं लाखों घटनाओं को ट्रिगर करता हूं, प्रत्येक घटना केवल एक बार होती है। मुझे तंत्र की तरह क्रॉन की आवश्यकता नहीं है (महीने का पहला रविवार, आदि), बस तिथि, समय और संदर्भ।

वर्तमान में मैं Quartz scheduler का उपयोग कर रहा हूं, और यह एक बहुत ही अच्छी परियोजना है, लेकिन इसमें बहुत से बदलावों (शेरिंग, बढ़ते मतदान अंतराल इत्यादि) के बाद भी हमें जो घटनाएं फेंकती हैं, उसे संभालने में कठिनाई होती है।) मूल लॉकिंग के कारण यह अंडरलाइन डेटाबेस पर प्रदर्शन करता है। इसके अलावा, यह हमारे लिए थोड़ा अधिक है, क्योंकि मूल रूप से हमारे पास लाखों एक बार ट्रिगर्स हैं, और अपेक्षाकृत कम संख्या में नौकरियां हैं।

मैं शायद सिर्फ निष्पादन समय के अनुसार क्रमबद्ध कार्यों के साथ JGroupsshared tree का उपयोग किसी भी सुझाव

+0

क्या विफलता के आसपास अपनी आवश्यकताओं कर रहे हैं? उदाहरण के लिए, यदि कोई मशीन नीचे जाती है, तो क्या आप एक "प्रतिस्थापन" घटनाओं को आग लगाना चाहते हैं जब प्रतिस्थापन आता है? –

+0

हां, क्वार्ट्ज के समान। इसके अलावा, मैं क्लस्टर में क्वार्ट्ज चलाता हूं, इसलिए हमेशा एक गर्म मशीन प्रतीक्षा होती है (क्वार्ट्ज में सभी नोड्स हर बार प्रतिस्पर्धा करने के लिए डीबी को मतदान करने की आवश्यकता होती है) –

+0

मैं बस सोच रहा था कि हम * क्वार्ट्ज के बिना चीजें कैसे बना सकते हैं। अगर हर नौकरी को स्वीकार किया जाना चाहिए, तो यह मुश्किल हो जाता है। यदि नौकरी दो बार चलती है तो दंड क्या है? (उदाहरण के लिए, क्या आप मिनट में एक बार आखिरी मिनट में निष्पादित सभी नौकरियों को स्वीकार कर सकते हैं?) –

उत्तर

0

सराहनीय होगा। नोड्स पहले कार्य और शेड्यूल टाइमर लेंगे, जो दिए गए समय पर निष्पादित होगा। कार्य हटाने पर टाइमर रद्द किया जा सकता है। तो मूल रूप से आप केवल जेग्रुप और सरल जावा टाइमर/निष्पादक का उपयोग कर सकते हैं।

मैं इसे पूरी पढ़ नहीं था, लेकिन यहाँ कुछ proof of concept or maybe even solution

0

तरीके के बारे में जावा टाइमर है?

import java.util.*; 

public class MyTask extends TimerTask{ 
    public void run(){ 
     System.out.println("do it!"); 
    } 
} 

और फिर

Timer timer = new Timer(); 

MyTask job1 = new MyTask(); 
// once after 2 seconds 
timer.schedule(job1, 2000); 

job1.cancel(); 

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second 
timer.schedule (job2, 1000, 5000); 
+0

बेहतर था 1. यह प्रक्रिया को पुनरारंभ नहीं करता है; 2. आप इसे लाखों नौकरियों में कैसे स्केल करते हैं? क्वार्ट्ज का लक्ष्य –

+0

को हल करना है। आपने उल्लेख नहीं किया कि दृढ़ता एक आवश्यकता है; 2. आपने कहा कि अपेक्षाकृत कम संख्या में नौकरियां हैं। – kromit

+0

मुझे खेद है, लेकिन मैंने "उच्च उपलब्धता" और "लाखों घटनाओं/लाखों एक बार ट्रिगर्स" का जिक्र किया ... –

1

अगर मैं एक ही परिदृश्य मैं निम्नलिखित करना होगा का सामना करना पड़ रहा था ...

सेटअप एक JMS कतार क्लस्टर (जैसे RabbitMQ या ActiveMQ) एक कतार प्रतिकृति का उपयोग कर कुछ बक्से पर सेटअप।

मेरी अच्छी अत्यधिक उपलब्ध जेएमएस कतार में सभी घटनाओं को फायर करें।

तब मैं, एक एजेंट अनुप्रयोग है कि JMS कतार की घटनाओं के रूप में की जरूरत पॉपअप कोड हैं मैं कई बक्से पर एक से अधिक एजेंट चला सकते हैं और है कि सही JMS विफलता यूआरएल आदि के साथ संयुक्त है

तुम भी इस्तेमाल कर सकते हैं मॉडल यदि आपके नौकरियों घटनाओं सक्रिय हो रहे हैं इसी प्रकार की ...

FYI करें, कोर में समय-निर्धारण की अच्छे तरह से जावा इस प्रकार है:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount); 
    threadPool.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     //Pop events from event queue. 
     //Do some stuff with them. 
    } 

    }, initialDelay, period, TimeUnit.X); 
संबंधित मुद्दे