قوائم المهام لـ TypeScript: نظرة عامة على المكتبات والتنفيذ العملي
في تطبيقات الويب الحديثة المكتوبة بـ TypeScript، غالبًا ما تنشأ الحاجة لتنفيذ عمليات تستهلك موارد كبيرة بشكل غير متزامن، دون حظر التدفق الرئيسي. لهذا الغرض، تُستخدم قوائم المهام (job queues). فهي تسمح بتأخير التنفيذ، وتوزيع الحمل، وضمان معالجة موثوقة للعمليات الخلفية. في هذه المقالة، سنستعرض أفضل المكتبات للعمل مع القوائم في TypeScript، وميزاتها، وأمثلة على استخدامها.
لماذا نحتاج إلى قوائم المهام؟
تخيل أن تطبيقك يحتاج إلى إرسال 1000 بريد إلكتروني، أو معالجة صور، أو إجراء حسابات معقدة. إذا تم ذلك بشكل متزامن، سينتظر المستخدم الرد لدقائق. القائمة تحل هذه المشكلة: تضع المهمة في قائمة، ويعالجها عامل (worker) في الخلفية. المزايا الرئيسية:
- المعالجة غير المتزامنة وغير الحاصلة
- قابلية التوسع (يمكن للعديد من العمال العمل بالتوازي)
- مقاومة الأعطال (إعادة تشغيل المهمة عند حدوث خطأ)
- الجدولة (يمكن تأخير المهام لوقت محدد)
أفضل المكتبات لـ TypeScript
معظم الحلول الشائعة مبنية على Redis - وهي قاعدة بيانات سريعة في الذاكرة، مثالية للقوائم. سنستعرض ثلاثة خيارات رئيسية:
1. Bull (الأكثر شيوعًا)
Bull هي مكتبة ناضجة وعالية الأداء لـ Node.js مع دعم كامل لـ TypeScript. توفر واجهة برمجة تطبيقات غنية وآليات مدمجة لإعادة المحاولة والتأخير والأولويات.
التثبيت:
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(`Sending email to user ${userId}`); await sendEmail(userId);});
// معالجة الأخطاء وإعادة المحاولةemailQueue.on('failed', (job, err) => { console.error(`Job ${job.id} failed: ${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('Processing:',