एक वेब डेवलपर के रूप में, यह महत्वपूर्ण है कि आपके ऐप्स जितनी जल्दी हो सके प्रदर्शन करें। आपको ऐसे वेब ऐप बनाने चाहिए जो सबसे तेज़ संभव समय में अनुरोधों का जवाब दें।
कई तकनीकों में से एक जो आपकी मदद कर सकती है वह है टास्क क्यूइंग।
तो, कार्य कतार क्या है, और आप इसका उपयोग Node.js एप्लिकेशन को अनुकूलित करने के लिए कैसे कर सकते हैं?
टास्क क्यूइंग क्या है?
संदेश कतार दो अनुप्रयोगों या सेवाओं के बीच अतुल्यकालिक संचार का एक साधन है, जिसे आमतौर पर कहा जाता है निर्माता और उपभोक्ता. यह सर्वर रहित और माइक्रोसर्विस आर्किटेक्चर में नियोजित एक प्रसिद्ध अवधारणा है।
इसकी अवधारणा काम या कामकतार एप्लिकेशन प्रदर्शन को बेहतर बनाने के लिए संदेश पंक्तिबद्धता का लाभ उठाता है। यह संदेशों को प्रबंधित करने की जटिलताओं को सार करता है और कतार का उपयोग करके अतुल्यकालिक रूप से कार्यों या कार्यों को प्रबंधित करने के लिए कार्यों को परिभाषित करने में सक्षम बनाता है, जिससे की दर कम हो जाती है स्मृति प्रयोग एक आवेदन के कुछ हिस्सों में।
मैसेज क्यू सॉफ्टवेयर का सबसे आम उदाहरण RabbitMQ है। टास्क क्यू टूल में सेलेरी और बुल शामिल हैं। आप कार्य कतार के रूप में कार्य करने के लिए RabbitMQ को भी कॉन्फ़िगर कर सकते हैं। बुल का उपयोग करके नोड.जेएस में कतारबद्ध कार्य के बारे में जानने के लिए आगे पढ़ें।
बुलएमक्यू क्या है?
BullMQ (Bull.js) एक Node.js लाइब्रेरी है जिसका उपयोग नोड अनुप्रयोगों में कतारों को लागू करने के लिए किया जाता है। बुल एक रेडिस-आधारित प्रणाली है (आप एक उपकरण के रूप में रेडिस से अधिक परिचित हो सकते हैं त्वरित डेटा भंडारण) और यह Node.js में टास्क क्यूइंग के लिए विचार करने का एक तेज़ और विश्वसनीय विकल्प है।
आप कई कार्यों के लिए बुल का उपयोग कर सकते हैं जैसे विलंबित नौकरियों को लागू करना, अनुसूचित नौकरियों, दोहराने योग्य नौकरियों, प्राथमिकता कतारों और कई अन्य।
तो, आप Node.js कार्यों को अतुल्यकालिक रूप से चलाने के लिए बुल और रेडिस का उपयोग कैसे कर सकते हैं?
Node.js. में टास्क क्यूइंग के लिए बुल और रेडिस को कैसे कॉन्फ़िगर करें
बुल के साथ Node.js में कतारबद्ध कार्य के साथ आरंभ करने के लिए, आपको अपनी मशीन पर Node.js और Redis स्थापित करने की आवश्यकता है। आप अनुसरण कर सकते हैं रेडिस लैब रेडिस को स्थापित करने के लिए गाइड करती है यदि आपके पास यह स्थापित नहीं है।
बुल को लागू करने के लिए पहला कदम इसे चलाकर अपने प्रोजेक्ट की निर्भरता में जोड़ना है एनपीएम बैल स्थापित करें या सूत जोड़ें बैल आपके प्रोजेक्ट के फ़ोल्डर के अंदर टर्मिनल में। जैसा कि नीचे दिखाया गया है, बुल में क्यू को इनिशियलाइज़ करने के कई तरीके हैं:
कॉन्स्ट कतार = ज़रूरत होना('साँड़');
// कतार को इनिशियलाइज़ करने के विभिन्न तरीके
// - Redis URL स्ट्रिंग का उपयोग करना
कॉन्स्ट ईमेल कतार = नया कतार('ईमेल कतार', 'रेडिस: //127.0.0.1:6379');// - रेडिस कनेक्शन और कतार विकल्प ऑब्जेक्ट के साथ
कॉन्स्ट वीडियो क्यू = नया कतार('वीडियो कतार', 'रेडिस: //127.0.0.1:6379', कतार विकल्प);// - रेडिस कनेक्शन के बिना लेकिन क्यूऑप्शन के साथ
कॉन्स्ट डॉक क्यू = नया कतार('दस्तावेज़ कतार', कतार विकल्प);
// - रेडिस कनेक्शन या कतार विकल्पों के बिना
कॉन्स्ट क्यू क्लाइंट = नया कतार('मेरी कतार');
ये सभी Node.js में बुल के लिए न्यूनतम कॉन्फ़िगरेशन का उपयोग करते हैं। विकल्प ऑब्जेक्ट कई गुणों का समर्थन करता है और आप उनके बारे में सीख सकते हैं बुल के प्रलेखन का कतार विकल्प अनुभाग.
बुलएमक्यू का उपयोग करके एक ईमेल टास्क क्यू लागू करना
ईमेल भेजने के लिए कतार लागू करने के लिए, आप अपने निर्माता फ़ंक्शन को परिभाषित कर सकते हैं जो ईमेल कतार में ईमेल जोड़ता है, और ईमेल भेजने को संभालने के लिए एक उपभोक्ता फ़ंक्शन।
सबसे पहले, आप Redis URL और कुछ क्यू विकल्पों का उपयोग करके कक्षा में अपनी क्यू को इनिशियलाइज़ कर सकते हैं जैसा कि नीचे देखा गया है।
// क्यूहैंडलर.जेएस
कॉन्स्ट कतार = ज़रूरत होना('साँड़');// यहां एक वास्तविक ईमेल हैंडलर मॉड्यूल का उपयोग करें - यह सिर्फ एक उदाहरण है
कॉन्स्ट ईमेलहैंडलर = ज़रूरत होना('./emailHandler.js');// स्थिरांक, Redis URL और कतार विकल्पों को परिभाषित करें
कॉन्स्ट REDIS_URL = 'रेडिस: //127.0.0.1:6379';कॉन्स्ट क्यूऑप्ट्स = {
// दर सीमक विकल्प कतार को ओवरलोड करने से बचने के लिए
सीमक: {
// कार्यों की कतार की अधिकतम संख्या ले सकती है
अधिकतम: 100,// बाद में नई नौकरी स्वीकार करने से पहले मिलीसेकंड में प्रतीक्षा करने का समय
// पहुंच सीमा
अवधि: 10000
},
उपसर्ग: 'ईमेल-कार्य', // सभी कतार कुंजियों में जोड़ा जाने वाला एक उपसर्ग
डिफ़ॉल्ट जॉबऑप्शन: { // कतार में कार्यों के लिए डिफ़ॉल्ट विकल्प
प्रयास: 3, // किसी कार्य को पुनः प्रयास करने के लिए डिफ़ॉल्ट संख्या// किसी कार्य को पूरा करने के बाद कतार से निकालने के लिए
हटाएंऑनकंप्लीट: सत्य
}
};कक्षाईमेल कतार{
निर्माता() {
यहकतार = नया कतार('ईमेल कतार', REDIS_URL, क्यूऑप्ट्स);
}
};
निर्यातगलती करना ईमेल कतार; // वर्ग निर्यात करें
अब जब आपने एक कतार आरंभ कर दी है, तो आप अपने निर्माता फ़ंक्शन को परिभाषित कर सकते हैं (बुल्स जोड़ना() समारोह) की एक विधि के रूप में ईमेल कतार कक्षा कार्य कतार में ईमेल जोड़ने के लिए। निम्नलिखित कोड ब्लॉक यह प्रदर्शित करता है:
// क्यूहैंडलर.जेएस
कक्षाईमेल कतार{
निर्माता () {
// ...
}// कतार में ईमेल जोड़ने के लिए निर्माता फ़ंक्शन
async addEmailToQueue (ईमेलडेटा) {
// कतार में नाम 'email_notification' के साथ कार्य जोड़ें
इंतजारयह.queue.add('ई - मेल अधिसूचना', ईमेलडेटा);
सांत्वना देना।लकड़ी का लट्ठा('ईमेल को कतार में जोड़ दिया गया है...');
}
};
निर्यातगलती करना ईमेल कतार; // वर्ग निर्यात करें
प्रोड्यूसर फंक्शन तैयार है, और अब आप एक कंज्यूमर फंक्शन को परिभाषित कर सकते हैं (Bull's प्रक्रिया() समारोह) कतार में सभी ईमेल कार्यों को संसाधित करने के लिए - यानी। ईमेल भेजने के लिए फ़ंक्शन को कॉल करें। आपको इस उपभोक्ता समारोह को कक्षा के निर्माता में परिभाषित करना चाहिए।
// क्यूहैंडलर.जेएस
कक्षाईमेल कतार{
निर्माता () {
// ...// उपभोक्ता फ़ंक्शन जो कार्य के निर्दिष्ट नाम को लेता है और
// एक कॉलबैक फ़ंक्शन
यहकतार प्रक्रिया ('ई - मेल अधिसूचना', async (ईमेलजॉब, हो गया) => {
सांत्वना देना।लकड़ी का लट्ठा('ईमेल अधिसूचना कार्य संसाधित करना');
इंतजार ईमेलहैंडलर.भेजेंईमेल (ईमेलजॉब); // ईमेल भेजें
पूर्ण(); // कार्य पूरा करें
})
}
// ...
};
निर्यातगलती करना ईमेल कतार; // वर्ग निर्यात करें
नौकरी में क्यू में अपने व्यवहार को परिभाषित करने के विकल्प भी हो सकते हैं या उपभोक्ता फ़ंक्शन इसे कैसे संभालता है। आप इसके बारे में अधिक जानकारी में प्राप्त कर सकते हैं बुल के दस्तावेज़ीकरण का कार्य विकल्प अनुभाग.
ईमेल नौकरी तर्क एक वस्तु है जिसमें कतार को संसाधित करने के लिए कार्य के गुण होते हैं। इसमें ईमेल बनाने के लिए आवश्यक मुख्य डेटा भी शामिल है. आसान समझ के लिए, ईमेल भेजें() कार्य इस उदाहरण के समान होगा:
// ईमेलहैंडलर.जेएस
कॉन्स्ट सेंडग्रिडमेल = ज़रूरत होना('@sendgrid/मेल');कॉन्स्ट apiKey = process.env। SENDGRID_API_KEY
SendgridMail.setApiKey (apiKey); // ईमेल ट्रांसपोर्टर सुरक्षा क्रेडेंशियल सेट करें
कॉन्स्ट ईमेल भेजें = async (ईमेल जॉब) => {
कोशिश {
// नौकरी से ईमेल डेटा निकालें
कॉन्स्ट {नाम, ईमेल} = ईमेलजॉब.डेटा;कॉन्स्ट संदेश = {
से: '[email protected]',
को: '[email protected]',
विषय: 'नमस्ते! स्वागत',
मूलपाठ: नमस्ते ${नाम}, एमयूओ' में आपका स्वागत है
};इंतजार SendgridMail.sendMail (संदेश); // ईमेल भेजें
// कार्य को कतार में पूर्ण के रूप में चिह्नित करें
इंतजार ईमेलJob.moveToCompleted('पूर्ण', सत्य);
सांत्वना देना।लकड़ी का लट्ठा('सफलतापूर्वक भेजा गया ईमेल...');
} पकड़ना (गलती) {
// कार्य को विफल नौकरियों में ले जाएं
इंतजार ईमेलजॉब.मूवटूफेल ({ संदेश: 'कार्य प्रसंस्करण विफल ..' });
सांत्वना देनात्रुटि (त्रुटि); // त्रुटि लॉग करें
}
}
निर्यातगलती करना ईमेल भेजें;
अब जब आपके पास निर्माता और उपभोक्ता दोनों कार्य परिभाषित और उपयोग के लिए तैयार हैं, तो अब आप प्रसंस्करण के लिए कतार में एक ईमेल जोड़ने के लिए अपने आवेदन में कहीं भी अपने निर्माता कार्य को कॉल कर सकते हैं।
एक उदाहरण नियंत्रक इस तरह दिखेगा:
// userController.js
कॉन्स्ट ईमेल कतार = ज़रूरत होना('../handlers/queueHandler.js')कॉन्स्ट साइनअप = async (अनुरोध, रेस) => {
कॉन्स्ट {नाम, ईमेल, पासवर्ड} = req.body;// --
// डेटाबेस में नए उपयोगकर्ता को जोड़ने के लिए एक प्रश्न ...
// --// ईमेल कतार में जोड़ें
कॉन्स्ट ईमेलडेटा = {नाम, ईमेल};
इंतजार EmailQueue.addEmailToQueue (emailData);
res.status (200.json({
संदेश: "साइन अप सफल रहा, कृपया अपना ईमेल जांचें"
})
}
आपका क्यूहैंडलर.जेएस फ़ाइल अब इस प्रकार होनी चाहिए:
// क्यूहैंडलर.जेएस
कॉन्स्ट कतार = ज़रूरत होना('साँड़');
कॉन्स्ट ईमेलहैंडलर = ज़रूरत होना('../हैंडलर/ईमेलहैंडलर.जेएस');कॉन्स्ट REDIS_URL = 'रेडिस: //127.0.0.1:6379';
कॉन्स्ट क्यूऑप्ट्स = {
सीमक: {
अधिकतम: 100,
अवधि: 10000
},उपसर्ग: 'ईमेल-कार्य',
डिफ़ॉल्ट जॉबऑप्शन: {
प्रयास: 3,
हटाएंऑनकंप्लीट: सत्य
}
};कक्षाईमेल कतार{
निर्माता() {
यहकतार = नया कतार('ईमेल कतार', REDIS_URL, क्यूऑप्ट्स);// उपभोक्ता
यहकतार प्रक्रिया ('ई - मेल अधिसूचना', async (ईमेलजॉब, हो गया) => {
सांत्वना देना।लकड़ी का लट्ठा('ईमेल अधिसूचना कार्य संसाधित करना');
इंतजार ईमेलहैंडलर.भेजेंईमेल (ईमेलजॉब);
पूर्ण();
})
}// निर्माता
async addEmailToQueue (ईमेलडेटा) {
// कतार में नाम 'email_notification' के साथ कार्य जोड़ें
इंतजारयह.queue.add('ई - मेल अधिसूचना', ईमेलडेटा);
सांत्वना देना।लकड़ी का लट्ठा('ईमेल को कतार में जोड़ दिया गया है...');
}
};
निर्यातगलती करना ईमेल कतार;
जब आप इसे Node.js REST API में लागू करते हैं, तो आपको साइनअप समापन बिंदु के प्रतिक्रिया समय में कमी और विकल्प की तुलना में तेज़ ईमेल वितरण समय दिखाई देगा।
टास्क कतारों ने आपको साइनअप और ईमेल त्रुटियों को स्वतंत्र रूप से संभालने में भी सक्षम बनाया।
टास्क कतारों का उपयोग करके अनुप्रयोगों का अनुकूलन
संदेश और कार्य कतार अनुप्रयोगों के सामान्य प्रदर्शन को बेहतर बनाने का एक शानदार तरीका है। वे बहुत सस्ते भी हैं और आप उन्हें किसी एप्लिकेशन के जितने हिस्सों में ज़रूरत हो उतने हिस्सों में इस्तेमाल कर सकते हैं।
यद्यपि इस ट्यूटोरियल ने कतारों के साथ मेमोरी-खपत कार्यों को संभालने के लिए एक उदाहरण परिदृश्य के रूप में ईमेल का उपयोग किया है, ऐसे कई अन्य मामले हैं जहां आप समान अवधारणाओं को लागू कर सकते हैं। इनमें भारी पढ़ने/लिखने के संचालन, उच्च-गुणवत्ता वाली छवियों या दस्तावेज़ों को प्रस्तुत करना और बल्क नोटिफिकेशन भेजना शामिल है।