قوائم المهام لـ JavaScript (Node.js): Bull و Bee-Queue و Kue
عند تطوير تطبيقات الويب على Node.js، غالبًا ما تنشأ الحاجة لتنفيذ عمليات تستهلك موارد كبيرة أو تستغرق وقتًا طويلاً خارج التدفق الرئيسي لمعالجة طلبات HTTP. إرسال النشرات البريدية، وإنشاء تقارير PDF، ومعالجة الصور المرفوعة، أو التفاعل مع واجهات برمجة التطبيقات الخارجية - كل هذه المهام يمكن أن تحجب استجابة المستخدم إذا تم تنفيذها بشكل متزامن. لحل هذه المشكلة، تُستخدم قوائم المهام (job queues).
قائمة المهام هي آلية تتيح:
- تأجيل تنفيذ العمل في الخلفية.
- إدارة الأولويات وترتيب المعالجة.
- إعادة تنفيذ المهام تلقائيًا عند حدوث أخطاء.
- توسيع نطاق المعالجة أفقيًا (عبر عدة عمال).
في نظام Node.js البيئي، حظيت ثلاث مكتبات بأكبر شعبية: Bull و Bee-Queue و Kue. جميعها مبنية فوق Redis، مما يضمن أداءً عاليًا ومقاومة للأعطال. دعنا نستعرض كلًا منها بالتفصيل.
1. Bull - قائمة المهام الأكثر شيوعًا ووظيفية
Bull (npm: bull) هي مكتبة ناضجة وموثقة جيدًا، تدعم تقريبًا جميع السيناريوهات الضرورية: المهام المؤجلة، والتكرار المجدول، والأولويات، وحدود السرعة، وأكوام الأخطاء، وحتى واجهة مرئية (Arete). Bull مدعومة بنشاط من المجتمع وتُوصى بها لمشاريع الإنتاج.
التثبيت:
npm install bullمثال بسيط - إنشاء قائمة ومعالج:
const Queue = require('bull');
// إنشاء قائمة باسم 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// إضافة مهمة (job)emailQueue.add({ to: 'user@example.com', subject: 'مرحبًا بك!', body: 'شكرًا لتسجيلك.'}, { attempts: 3, // محاولات عند الخطأ backoff: 5000, // تأخير بين المحاولات (5 ثوانٍ) delay: 10000 // تأجيل لمدة 10 ثوانٍ});
// المعالج (العامل)emailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`إرسال بريد إلكتروني إلى ${to}: ${subject}`); // هنا استدعاء دالة إرسال البريد الإلكتروني الخاصة بك await sendEmail(to, subject, body);});الإمكانيات الرئيسية لـ Bull:
- إعادة المحاولات - ضبط عدد المحاولات والتأخير الأسي.
- الجدولة (cron) - تنفيذ المهام وفقًا لجدول زمني (مثل كل ليلة).
- الأولويات - تتم معالجة المهام ذات الأولوية العالية أولاً.
- الأحداث - الاشتراك في الأحداث (completed، failed، progress).
- الإغلاق اللطيف (Graceful shutdown) - إنهاء العمل بشكل صحيح.
2. Bee-Queue - قائمة مهام خفيفة وسريعة
Bee-Queue (npm: bee-queue) هي بديل بسيط لـ Bull. تقدم فقط الإمكانيات الأساسية، ولكنها تفعل ذلك بأقل تكاليف إضافية. Bee-Queue مثالية للسيناريوهات البسيطة التي لا تحتاج إلى إعدادات معقدة، ولكن السرعة مهمة.
التثبيت:
npm install bee-queueمثال على الاستخدام:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }, isWorker: true});
// إضافة مهمةimageQueue.createJob({ imageId: 123, size: 'thumbnail' }) .timeout(30000) // مهلة 30 ثانية .retries(2) // محاولتان .save() .then(job => console.log('تم إنشاء المهمة:', job.id));
// المعالجimageQueue.process((job, done) => { console.log(`معالجة الصورة ${job.data.imageId}`); // تنفيذ العمل proce