Node.js में पृष्ठभूमि प्रक्रियाएँ


97

NodeJS एप्लिकेशन में पृष्ठभूमि प्रक्रियाओं को संभालने के लिए एक अच्छा aproach क्या है?

परिदृश्य : एक उपयोगकर्ता द्वारा किसी ऐप को कुछ पोस्ट करने के बाद मैं डेटा को क्रंच करना चाहता हूं, बाहरी संसाधनों से अतिरिक्त डेटा का अनुरोध करता हूं, आदि। यह सब काफी समय लेने वाला है, इसलिए मैं इसे रीक / रेस लूप से बाहर चाहता हूं। आदर्श सिर्फ नौकरियों की एक कतार होगी जहां आप जल्दी से नौकरी छोड़ सकते हैं और एक डेमन या टास्क रनर हमेशा सबसे पुराना लेगा और इसे प्रोसेस करेगा।

RoR में मैंने इसे Delayed Job की तरह किया होगा। इस एपीआई के समतुल्य नोड क्या है?


4
यह एक सॉफ्टवेयर की सिफारिश है क्योंकि यह अब बंद हो गया है, जो कि बंद हो जाएगा। यदि आप अंतिम वाक्य को "इस एपीआई के समतुल्य NodeJS क्या है?" यह अधिक विषय पर हो जाता है। मैं इस उत्तर को बंद होने के बजाय देखना चाहूंगा, क्योंकि मुझे कुछ ऐसा ही करने की आवश्यकता है।
ssube

धन्यवाद, इसे rephrased।
ओले स्पार्मैन

2
नीचे अच्छे सुझाव। ChildProcessएपीआई भी है जो उपयोगी हो सकता है। nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann - मुझे यह जानने में दिलचस्पी होगी कि आपने आखिरकार क्या चुना और यदि आप एक बहुत ही सरल उदाहरण प्रदान कर सकते हैं कि आपने अपने निर्णय को NodeJS के साथ कैसे एकीकृत किया - धन्यवाद!
MLissCetrus

@MLissCetrus मैंने अमृत सीखने और अब NodeJS का उपयोग नहीं करने का फैसला किया :)
Ole Spaarmann

जवाबों:


115

यदि आप कुछ हल्का चाहते हैं, जो सर्वर के समान प्रक्रिया में चलता है, तो मैं बुल की सिफारिश करता हूं । इसमें एक सरल एपीआई है जो आपकी कतारों पर एक महीन दाने के नियंत्रण की अनुमति देता है।

यदि आप एक स्टैंडअलोन कार्यकर्ता प्रक्रिया के रूप में चलने वाली किसी चीज़ की तलाश कर रहे हैं, तो शायद क्यू में देखें । यह एक RESTful API सर्वर के रूप में चल सकता है, और यहां तक ​​कि इसके लिए कई फ्रंट-एंड एप्लिकेशन भी लिखे हैं।

यदि आप रूबी के रेसक्यू से परिचित हैं, तो नोड-रेसक नामक नोड कार्यान्वयन है

बुल, Kue और नोड-resque सभी द्वारा समर्थित Redis , जो Node.js कार्यकर्ता कतारों के बीच हर जगह है। सभी 3 वही कर पाएंगे जो RoR का DelayedJob करता है, यह उन विशिष्ट विशेषताओं की बात है जो आप चाहते हैं, और आपकी API प्राथमिकताएँ।


3
यह एक बहुत अच्छा उत्तर है, लेकिन चाइल्डप्रोसेस एपीआई और वेबवर्क-थ्रेड्स मॉड्यूल का उल्लेख इसे महान बना सकता है। ;)
ssube

@ssube मैं आपसे असहमत हूं। जब तक आप एक कांटा बनाने का मतलब है कि कुछ कमांड चलाने के लिए एक कतार में लग रहा है आप सही हैं। मुझ से +1। चाइल्ड_प्रोसेस जो मैं उपयोग कर रहा हूं और मेरी समस्या यह है कि मैं प्रक्रियाओं का एक बड़ा सेट खोल सकता हूं, लेकिन अगर मेरे पास एक कतार में चलाने के लिए कार्यों को प्रबंधित करने का एक तरीका है, तो मुझे खुशी होगी कि सीपी एक अच्छा समाधान है। यह किया जा सकता है, लेकिन बिंदु यह है कि सभी काम खुद न करें, लेकिन कोड का पुन: उपयोग करने के लिए लड़ाई का परीक्षण किया जाता है (इस मामले में कुए की तरह कुछ है जो आपके लिए आवश्यक सभी जादू करता है और एपीआई एकीकरण की अनुमति देता है)।
देवलवद

क्या PM2 क्लस्टरिंग के साथ बुल काम करता है? या क्या आपको अपने स्वयं के क्लस्टर बनाने की आवश्यकता है, जैसा कि उनके प्रलेखन में दिखाया गया है?
शायन नाहरवार

31

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

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

दो प्रक्रियाओं के लिए सह-होस्ट होना आवश्यक नहीं है, वे अलग-अलग वीएम, डॉकर कंटेनर, जो भी आप उपयोग करते हैं, पर हो सकते हैं। यह आपको बहुत परेशानी के बिना बाहर स्केल करने की अनुमति देता है।


3
वास्तव में एकमात्र उत्तर जिसने खरगोश का उल्लेख किया है? यह उद्यम का जवाब है। +1
ऑग्गी गार्डनर

11

यदि आप MongoDB का उपयोग कर रहे हैं, तो मैं एजेंडा की सलाह देता हूं । इस तरह, अलग-अलग Redis इंस्टेंसेस नहीं चल रहे हैं और शेड्यूलिंग, कतार और वेब UI जैसी सुविधाएँ मौजूद हैं। एजेंडा यूआई वैकल्पिक है और इसे अलग से चलाया जा सकता है।

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


3

मैं शेड्यूलिंग नौकरियों के लिए रेडिस का उपयोग करने का सुझाव देना चाहता हूं । इसमें विभिन्न डेटा संरचनाएं हैं, आप हमेशा एक का चयन कर सकते हैं जो आपके उपयोग के मामले में बेहतर हो।

आपने RoR और DJ का उल्लेख किया है, इसलिए मुझे लगता है कि आप साइडकीक से परिचित हैं। यदि आप चाहते हैं, तो आप नौकरी शेड्यूलिंग के लिए नोड-साइडकीक का उपयोग कर सकते हैं , लेकिन इसका मुख्य उद्देश्य आरओआर के साथ नोडज को एकीकृत करना है।

कार्यकर्ता के लिए मैं पीएम 2 का उपयोग करने की सिफारिश करूंगा । इसका व्यापक रूप से उपयोग और सक्रिय रूप से रखरखाव किया जाता है। यह बहुत सारी समस्याओं (जैसे तैनाती, निगरानी, ​​क्लस्टरिंग) को हल करता है, इसलिए सुनिश्चित करें कि यह आपके लिए ओवरकिल नहीं होगा।


1

मैंने मधुमक्खी-कतार और बैल की कोशिश की और अंत में बैल को चुना। मैंने पहली बार मधुमक्खी-कतार बी / सी को चुना, यह काफी सरल है, उनके उदाहरणों को समझना आसान है, जबकि बैल के उदाहरण थोड़ा जटिल हैं। मधुमक्खी की विकी बी क्यू की उत्पत्ति भी मेरे साथ प्रतिध्वनित होती है। लेकिन मधुमक्खी के साथ समस्या है <1> उनके समस्या समाधान का समय काफी धीमा है, उनका नवीनतम अद्यतन 10 महीने पहले था। <2> मुझे नौकरी रोकने / रद्द करने का आसान तरीका नहीं मिल रहा है।

दूसरी ओर, बुल अक्सर अपने कोड, मुद्दों की प्रतिक्रिया को अपडेट करता है। Node.js नौकरी कतार मूल्यांकन ने कहा कि बैल की कमजोरी "धीमे मुद्दों का समाधान समय" है, लेकिन मेरा अनुभव इसके विपरीत है!

लेकिन वैसे भी उनकी एपीआई समान है इसलिए एक से दूसरे में स्विच करना काफी आसान है।


-6

मैं आपको ऐप बनाने के लिए एक उचित Node.js ढांचे का उपयोग करने का सुझाव देता हूं।

मुझे लगता है कि सबसे शक्तिशाली और प्रयोग करने में आसान Sails.js है

यह MVC फ्रेमवर्क है, इसलिए यदि आप ROR में विकसित करने के लिए उपयोग किए जाते हैं, तो आपको यह बहुत आसान लगेगा!

यदि आप इसका उपयोग करते हैं, तो यह पहले से ही एक शक्तिशाली (जावास्क्रिप्ट शब्दों में) नौकरी प्रबंधक को पेश करता है।

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

यदि आप अधिक जानकारी की जरूरत है मुझसे संपर्क करने में संकोच नहीं करते!


5
मैं नोड के लिए एक पृष्ठभूमि प्रक्रिया प्रबंधक की तलाश में हूं। परिभाषा के अनुसार यह आपके वेब ऐप से अलग होना चाहिए। और इससे कोई फर्क नहीं पड़ता कि आप Sails, Express, Hapi या जो कुछ भी आप पसंद करते हैं, का उपयोग करें।
ओले स्पार्मैन

ठीक है आप बैल या वेबवर्क-थ्रेड्स आज़मा सकते हैं ... सौभाग्य
सफ़ेद

ऐसा लगता है कि sails.js बहुत बड़ा है और क्रोनजॉब्स की तुलना में बहुत अधिक है। मुझे नोड-क्रोन ( github.com/kelektiv/node-cron ) मिला, जो शर्त लगाता है कि sails.s का उपयोग करता है।
23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.