TypeScript के लिए कार्य कतारें: लाइब्रेरियों का अवलोकन और व्यावहारिक कार्यान्वयन
TypeScript में आधुनिक वेब अनुप्रयोगों में, मुख्य थ्रेड को अवरुद्ध किए बिना संसाधन-गहन संचालन को एसिंक्रोनस रूप से निष्पादित करने की आवश्यकता अक्सर उत्पन्न होती है। इसके लिए कार्य कतारों (job queues) का उपयोग किया जाता है। वे निष्पादन में देरी करने, लोड वितरित करने और पृष्ठभूमि प्रक्रियाओं के विश्वसनीय प्रसंस्करण को सुनिश्चित करने की अनुमति देते हैं। इस लेख में, हम TypeScript में कतारों के साथ काम करने के लिए सर्वोत्तम लाइब्रेरियों, उनकी विशेषताओं और उपयोग के उदाहरणों पर विचार करेंगे।
कार्य कतारों की आवश्यकता क्यों है?
कल्पना करें कि आपके एप्लिकेशन को 1000 ईमेल भेजने, छवियों को संसाधित करने या जटिल गणना करने की आवश्यकता है। यदि आप इसे सिंक्रोनस रूप से करते हैं, तो उपयोगकर्ता मिनटों तक प्रतिक्रिया की प्रतीक्षा करेगा। कतार इस समस्या का समाधान करती है: आप कार्य को एक सूची में रखते हैं, और एक वर्कर (worker) इसे पृष्ठभूमि में संसाधित करता है। मुख्य लाभ:
- एसिंक्रोनस और नॉन-ब्लॉकिंग प्रसंस्करण
- स्केलेबिलिटी (कई वर्कर समानांतर रूप से काम कर सकते हैं)
- विफलताओं के प्रति सहनशीलता (त्रुटि होने पर कार्य पुनः प्रारंभ हो जाता है)
- शेड्यूलिंग (कार्यों को एक निश्चित समय के लिए स्थगित किया जा सकता है)
TypeScript के लिए शीर्ष लाइब्रेरी
अधिकांश लोकप्रिय समाधान Redis पर बनाए गए हैं - यह एक तेज़ इन-मेमोरी डेटाबेस है, जो कतारों के लिए आदर्श है। आइए तीन मुख्य विकल्पों पर विचार करें:
1. Bull (सबसे लोकप्रिय)
Bull Node.js के लिए एक परिपक्व और उच्च-प्रदर्शन वाली लाइब्रेरी है जिसमें TypeScript के लिए पूर्ण समर्थन है। यह एक समृद्ध API और पुनरावृत्ति, विलंब और प्राथमिकताओं के लिए अंतर्निहित तंत्र प्रदान करता है।
स्थापना:
npm install bullnpm install @types/bullकतार और हैंडलर बनाने का उदाहरण:
import Queue from 'bull';
// ईमेल वितरण को संसाधित करने के लिए कतार बनाएँconst emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// कार्य जोड़ेंasync function sendWelcomeEmail(userId: string) { await emailQueue.add({ userId });}
// हैंडलर (वर्कर)emailQueue.process(async (job) => { const { userId } = job.data; // ईमेल भेजने का तर्क यहाँ console.log(`उपयोगकर्ता ${userId} को ईमेल भेजा जा रहा है`); await sendEmail(userId);});
// त्रुटियाँ और पुनः प्रयासemailQueue.on('failed', (job, err) => { console.error(`कार्य ${job.id} विफल: ${err.message}`);});2. Bee-Queue (हल्का विकल्प)
Bee-Queue एक न्यूनतम कतार है, जो Redis पर भी काम करती है। यह Bull से सरल है, लेकिन सरल परिदृश्यों के लिए तेज़ है। यह तब उपयुक्त है जब जटिल सेटिंग्स की आवश्यकता नहीं होती है।
स्थापना:
npm install bee-queuenpm install @types/bee-queueउदाहरण:
import Queue from 'bee-queue';
const imageQueue = new Queue('images', { redis: { host: 'localhost', port: 6379 }});
// कार्य जोड़नाimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }).save();
// प्रसंस्करणimageQueue.process((job, done) => { const { imagePath } = job.data; // छवि प्रसंस्करण resizeImage(imagePath) .then(() => done()) .catch(done);});3. RSMQ (अलग वर्कर के बिना)
RSMQ (Redis Simple Message Queue) शुद्ध Redis पर एक कतार है, जिसे अलग वर्कर प्रक्रिया चलाने की आवश्यकता नहीं होती है। कार्यों को pull तंत्र के माध्यम से संसाधित किया जाता है। माइक्रोसर्विस आर्किटेक्चर के लिए आदर्श।
स्थापना:
npm install rsmqउदाहरण:
import RedisSMQ from 'rsmq';
const rsmq = new RedisSMQ({ host: 'localhost', port: 6379 });
// कतार बनाएँawait rsmq.createQueueAsync({ qname: 'tasks' });
// संदेश भेजेंawait rsmq.sendMessageAsync({ qname: 'tasks', message: '{"type":"process_payment"}' });
// प्राप्त करें और संसाधित करें (लूप में)const message = await rsmq.receiveMessageAsync({ qname: 'tasks' });if (message.id) { console.log('प्रसंस्करण:', पुस्तकालय में भी
PHP पर ईमेल भेजना: PHPMailer, mail() और विकल्प
Node.js में Prometheus मेट्रिक्स: मॉनिटरिंग के लिए prom-client लाइब्रेरी