2015-08-08 12 views
11

में कतार कार्य मैं एक नोड एप्लिकेशन बना रहा हूं जो एक नए कर्मचारी को मचान करने के लिए "कार्यकर्ता" के रूप में कार्य करेगा और फिर एप्लिकेशन को एडब्ल्यूएस पर अपलोड करेगा। मचान चक्र को पूरा करने वाले 5 कार्य हैं।नोड

मैं जानना चाहता हूं कि आने वाले अनुरोधों को कतार में नोड/एक्सप्रेस में संभव है या फिर चक्र सफलतापूर्वक पूरा होने पर कतार में अनुरोधों के लिए मचान चक्र शुरू करें। एक समय में केवल एक मचान चक्र चलाना चाहिए।

+0

क्या यह एप्लिकेशन 'क्लस्टर' या एक प्रक्रिया है? क्या आप 'async' शैली या वादे का उपयोग करके एक उत्तर पसंद करेंगे? –

+0

@AaronDufour मैं इसे एक प्रक्रिया के रूप में चलाने के लिए पसंद करूंगा। – leaksterrr

उत्तर

6

हाँ, आप यह कर सकते हैं।

app.get('/', function (req, res) { 
    scaffold().then(function() { 
    res.send('done'); 
    }); 
}); 

हम promise-queue इस्तेमाल करेंगे चीजों को आसान बनाने के लिए: शायद अपने वर्तमान कोड कुछ इस तरह (मैं तुम्हें वादों का उपयोग कर रहे संभालने हूँ) लग रहा है। सबसे पहले हमें एक कतार बनाने की आवश्यकता है:

var queue = new Queue(1); 

तर्क यह है कि कतार एक साथ चलने वाली वस्तुओं की संख्या है। चूंकि आप कोई सहमति नहीं चाहते हैं, हम 1 का उपयोग करते हैं। अब, हम एक वादा चल के बजाय एक वादा कारखाने में पारित करने के लिए की जरूरत है:

app.get('/', function (req, res) { 
    queue.add(function() { 
    return scaffold().then(function() { 
     res.send('done'); 
    }); 
    }); 
}); 

हम सिर्फ एक वादा में पारित कर दिया है, यह तुरंत शुरू होगा। यही कारण है कि हमें एक ऐसे कार्य में क्यों जाना होगा जो वादा वापस कर देता है।

यदि आप तुरंत अनुरोध का जवाब देना चाहते हैं और कार्य समाप्त होने की प्रतीक्षा नहीं करते हैं, तो आप इसे वादे फैक्ट्री के बाहर ले जा सकते हैं। यह हमें अतिरिक्त अज्ञात फ़ंक्शन से बचने की अनुमति देता है क्योंकि अब scaffold वादा कारखाना है जिसे हम कतार बनाना चाहते हैं।

app.get('/', function (req, res) { 
    queue.add(scaffold); 
    res.send('done'); 
}); 
+1

मेरा आवेदन वादे का उपयोग नहीं कर रहा है, मैं वादे का उपयोग करने और आपको वापस आने के लिए दोबारा प्रतिक्रिया दूंगा। – leaksterrr

+0

@leaksterrr यदि आप काम करने के लिए कुछ कोड दिखाते हैं तो मुझे आपको कुछ-पॉइंटर्स गैर-वादे कोड की ओर ध्यान देने में खुशी होगी। –

-2

कोशिश अपने आने वाले घटना पर कांटा का उपयोग करें:

http://nodejs.org/api/child_process.html

प्रत्येक बच्चे पर आवश्यक brefore मचान और एडब्ल्यूएस को अपलोड सभी तत्वों को एक के बाद एक मिलता है।

+0

अधिकांश लोग कार्य लोड पर लेने के लिए नई प्रक्रियाओं को बढ़ाने के प्रतिमान से दूर होने के लिए निजिनक्स का उपयोग करते हैं। और अधिक अगर अनियमित यह प्रमुख डीओएस हमलों के लिए एक बिंदु बन सकता है। – tsturzl

2

यह "सख्ती से Node.js" जवाब नहीं है, लेकिन मैं अत्यधिक इस समस्या (NodeJS पुस्तकालय के रूप में fivebeans का प्रयोग करके) के हल के लिए एक मार्ग के रूप Beanstalkd में देखने की सलाह देते चाहते हैं।

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

+0

यदि आप रुचि रखते हैं तो मेरे पास http://slides.com/michaelholroyd/asyncnodejs#/4 पर beanstalkd का उपयोग कर सिस्टम के बारे में कुछ स्लाइड हैं – Meekohi