قوائم المهام لـ TypeScript: Bull و Bee-Queue والمعالجة غير المتزامنة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

قوائم المهام لـ TypeScript: دليل شامل لـ Bull و Bee-Queue



عند تطوير تطبيقات الويب الحديثة باستخدام TypeScript، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد بشكل غير متزامن، دون حظر التدفق الرئيسي. على سبيل المثال: إرسال إشعارات البريد الإلكتروني، إنشاء تقارير PDF، معالجة الصور أو المزامنة مع واجهات برمجة التطبيقات الخارجية. لحل هذه المشكلات، تُستخدم قوائم المهام (job queues). في هذه المقالة، سنستعرض بالتفصيل أشهر مكتبتين لـ TypeScript — Bull و Bee-Queue، بالإضافة إلى كيفية دمجها في مشروعك.



لماذا نحتاج إلى قوائم المهام؟



تتيح قائمة المهام ما يلي:

  • تقسيم المسؤوليات — الخدمة الرئيسية مسؤولة فقط عن إضافة المهمة، بينما المعالج مسؤول عن تنفيذها.
  • إدارة الحمل — يمكن تحديد عدد المهام المتوازية (concurrency).
  • ضمان التسليم — لا تُفقد المهام حتى في حالة تعطل العملية (بفضل Redis).
  • جدولة التنفيذ — تأجيل مهمة لوقت محدد أو تكرارها وفقًا لجدول زمني.
  • معالجة الأخطاء — محاولات إعادة تلقائية (retry) مع تأخير تصاعدي.


Bull — قائمة المهام الأكثر شيوعًا لـ Node.js و TypeScript



Bull هي مكتبة قوية تعتمد على Redis، وتدعم مجموعة كاملة من الميزات: الأولويات، إعادة المحاولة، التأخيرات، الإيقاف المؤقت، الأحداث والمراقبة. تتمتع Bull بكتابة أنواع ممتازة لـ TypeScript.



التثبيت والإعداد

npm install bull @types/bull


مثال بسيط لقائمة مهام لإرسال البريد الإلكتروني:

import Queue from 'bull';

interface EmailJob { to: string; subject: string; body: string;}

// إنشاء قائمة مهام باسم 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // حتى 3 محاولات backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});

// المعالج — يتم تنفيذه في الخلفيةemailQueue.process(async (job) => { console.log(`جارٍ إرسال البريد الإلكتروني إلى ${job.data.to}`); // محاكاة الإرسال await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`تم إرسال البريد الإلكتروني: ${job.data.subject}`);});

// إضافة مهمةasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: 'مرحبًا من قائمة المهام!', body: 'هذه رسالة اختبارية.', });}

addEmail();


الإمكانيات المتقدمة لـ Bull



  • المهام المتكررة (cron): queue.add(data, { repeat: { cron: '0 8 * * *' } })
  • الأولويات: queue.add(data, { priority: 1 }) — كلما قل الرقم، زادت الأولوية.
  • تأخير التنفيذ: queue.add(data, { delay: 60000 }) — تأجيل لمدة دقيقة واحدة.
  • الأحداث: يمكن الاشتراك في completed و failed و progress وغيرها.
  • الإيقاف المؤقت/الاستئناف: queue.pause() / queue.resume().


// معالجة الأحداثemailQueue.on('completed', (job, result) => {  console.log(`المهمة ${job.id} اكتملت`);});

emailQueue.on('failed', (job, err) => { console.error(`المهمة ${job.id} فشلت: ${err.message}`);});


Bee-Queue — بديل خفيف الوزن



Bee-Queue هي قائمة مهام بسيطة تعتمد على Redis، وهي أبسط وأسرع من Bull من حيث استهلاك الذاكرة. مناسبة للمشاريع الصغيرة أو الحالات التي لا تحتاج إلى إعدادات معقدة.



التثبيت والمثال

npm install bee-queue


import Bee from 'bee                    

توصيات