2015-06-15 8 views
12

मैं Node.js एप्लिकेशन में शेड्यूलिंग कार्यों के लिए node-cron मॉड्यूल का उपयोग कर रहा हूं। मैं कोर क्लस्टर मॉड्यूल का उपयोग कर कई प्रक्रियाओं में एप्लिकेशन को भी चलाने के लिए चाहता हूं।क्लस्टर मॉड्यूल का उपयोग करने वाले नोड.जेएस अनुप्रयोग में क्रॉन जॉब कैसे चलाएं?

कई प्रक्रियाओं में चल रहा अनुप्रयोग प्रत्येक प्रक्रिया में निर्धारित कार्यों निष्पादन में समाप्त होता है (उदाहरण के लिए यदि कोई ईमेल ईमेल भेजना था तो ईमेल कई बार भेजा जाएगा)।

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

+0

आप डेटाबेस पर कुछ ध्वज सत्यापित करने के लिए एक विशेष प्रक्रिया का उपयोग करने का प्रयास कर सकते हैं ताकि आप जांच सकें कि कोई व्यक्ति पहले से ही वह नौकरी लेता है और इसे फिर से नहीं लेता है। इसे डेटाबेस पर केवल कुछ पंक्तियां और एक बहुत छोटी तालिका लेनी चाहिए (या एक पंक्ति यदि आपके पास पहले से कॉन्फ़िगरेशन तालिका है)। – Gepser

+0

हां, यह एक समाधान हो सकता है। शायद उस विषय पर कुछ उदाहरण लेख हैं? असल में मैं अलग प्रक्रिया बनाना चाहता हूं जो केवल क्रॉन जॉब निष्पादन को संभालेगी। क्या यह संभव है? – epidemiya30

उत्तर

8

कुछ शोध के बाद मैं "Distributed locks using Redis" समाधान के साथ समाप्त हुआ। उस के लिए नोड मॉड्यूल है: node-redis-warlock

आशा है कि यह उत्तर किसी और के लिए उपयोगी होगा।

अद्यतन। मिनिमल नमूना कोड:

var Warlock = require('node-redis-warlock'), 
    redis = require('redis'); 

// Establish a redis client 
redis = redis.createClient(); 

// and pass it to warlock 
var warlock = new Warlock(redis); 

function executeOnce (key, callback) { 
    warlock.lock(key, 20000, function(err, unlock){ 
     if (err) { 
      // Something went wrong and we weren't able to set a lock 
      return; 
     } 

     if (typeof unlock === 'function') { 
      setTimeout(function() { 
       callback(unlock); 
      }, 1000); 
     } 
    }); 
} 

// Executes call back only once 
executeOnce('every-three-hours-lock', function(unlock) { 
    // Do here any stuff that should be done only once...    
    unlock();   
}); 

अद्यतन 2। अधिक विस्तृत उदाहरण:

const CronJob = require('cron').CronJob; 
const Warlock = require('node-redis-warlock'); 
const redis = require('redis').createClient(); 
const warlock = new Warlock(redis); 
const async = require('async'); 

function executeOnce (key, callback) { 
    warlock.lock(key, 20000, function(err, unlock) { 
     if (err) { 
      // Something went wrong and we weren't able to set a lock 
      return; 
     } 

     if (typeof unlock === 'function') { 
      setTimeout(function() { 
       callback(unlock); 
      }, 1000); 
     } 
    }); 
} 

function everyMinuteJobTasks (unlock) { 
    async.parallel([ 
     sendEmailNotifications, 
     updateSomething, 
     // etc... 
    ], 
    (err) => { 
     if (err) { 
      logger.error(err); 
     } 

     unlock(); 
    }); 
} 

let everyMinuteJob = new CronJob({ 
    cronTime: '*/1 * * * *', 
    onTick: function() { 
     executeOnce('every-minute-lock', everyMinuteJobTasks); 
    }, 
    start: true, 
    runOnInit: true 
}); 

/* Actual tasks */ 
let sendEmailNotifications = function(done) { 
    // Do stuff here 
    // Call done() when finished or call done(err) if error occurred 
} 

let updateSomething = function(done) { 
    // Do stuff here 
    // Call done() when finished or call done(err) if error occurred 
} 

// etc... 
+0

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

+1

मैंने अपना जवाब अपडेट किया है। उम्मीद है कि मददगार होगा ;-) – epidemiya30

+0

शानदार, मैं त्वरित प्रतिक्रिया की सराहना करता हूं। – stevokk

2

हैं, तो PM2 उपयोग कर रहे हैं आप द्वारा प्रदान की PM2 एक वातावरण चर जो PM2 2.5 या अधिक से अधिक की आवश्यकता है ही NODE_APP_INSTANCE कहा जाता है का उपयोग कर सकते हैं।

NODE_APP_INSTANCE वातावरण चर उदाहरण के लिए, आप सिर्फ इस

if(process.env.NODE_APP_INSTANCE == 0) { //schedule your cron job here since this part will be executed for only one cluster } ,

के बाद से दो प्रक्रियाओं कर सकते हैं केवल एक ही प्रक्रिया पर एक cronjob चलाने के लिए चाहते हो सकता है प्रक्रिया के बीच अंतर निर्धारित करने के लिए इस्तेमाल किया जा सकता, कर सकते हैं एक ही संख्या कभी नहीं है।

पीएम 2 आधिकारिक डॉक्टर here पर अधिक जानकारी।

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