قوائم المهام لجافا سكريبت (Node.js): Bull, Bee-Queue و Kue
في تطبيقات الويب الحديثة على Node.js، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد بشكل غير متزامن، دون حظر التدفق الرئيسي لمعالجة الطلبات. لهذا الغرض، تُستخدم قوائم المهام (job queues). فهي تسمح بتأجيل تنفيذ العمل، وتوزيع الحمل بين عدة عمليات، وضمان إعادة المعالجة في حالة حدوث أخطاء.
في هذه المقالة، سنستعرض ثلاث مكتبات شائعة للعمل مع قوائم المهام في Node.js: Bull و Bee-Queue و Kue. جميعها تستخدم Redis كوسيط للرسائل، مما يضمن أداءً عاليًا وموثوقية.
1. Bull — المكتبة الأكثر شهرة ووظيفية
Bull هي قائمة مهام حديثة وسريعة وموثوقة لـ Node.js، مبنية على Redis. وهي تدعم جميع الوظائف الرئيسية: المهام المؤجلة، إعادة المحاولة، الأولويات، الإيقاف المؤقت/الاستئناف، بالإضافة إلى المراقبة عبر واجهة مستخدم مدمجة.
التثبيت
npm install bullمثال أساسي
const Queue = require('bull');
// إنشاء قائمةconst emailQueue = new Queue('email', 'redis://127.0.0.1:6379');
// معالج المهامemailQueue.process(async (job) => { const { to, subject } = job.data; console.log(`إرسال بريد إلكتروني إلى ${to}: ${subject}`); // محاكاة الإرسال await new Promise(resolve => setTimeout(resolve, 1000)); return { success: true };});
// إضافة مهمةemailQueue.add({ to: 'user@example.com', subject: 'مرحبًا من Bull!'}, { attempts: 3, // إعادة المحاولة 3 مرات عند الخطأ delay: 5000, // تأخير لمدة 5 ثوانٍ priority: 1 // أولوية عالية});الإمكانيات الرئيسية لـ Bull
- إعادة المحاولة — إعادة تلقائية عند الفشل مع تأخير قابل للتخصيص.
- الأولويات — تتم معالجة المهام ذات الأولوية العالية أولاً.
- المهام المؤجلة — يمكن تعيين تأخير قبل التنفيذ.
- الإيقاف المؤقت والاستئناف — إيقاف القائمة للصيانة.
- المراقبة — واجهة ويب مدمجة
bull-board. - الأحداث — الاشتراك في الأحداث (completed, failed, progress).
مثال متقدم مع الأحداث
const Queue = require('bull');const myQueue = new Queue('myQueue');
myQueue.on('completed', (job, result) => { console.log(`المهمة ${job.id} اكتملت:`, result);});
myQueue.on('failed', (job, err) => { console.error(`المهمة ${job.id} فشلت: ${err.message}`);});
myQueue.process(async (job) => { // التقدم await job.progress(50); // التنفيذ return { status: 'ok' };});Bull موصى به للمشاريع التي تتطلب أقصى مرونة وأدوات جاهزة للمراقبة.
2. Bee-Queue — بديل خفيف وسريع
Bee-Queue هي قائمة مهام بسيطة، تركز على الأداء. إنها أبسط من Bull، ولكنها توفر جميع الإمكانيات الأساسية: المهام المؤجلة، إعادة المحاولة، الأولويات، والتوسع.
التثبيت
npm install bee-queueمثال استخدام
const Queue = require('bee-queue');
const imageQueue = new Queue('images', { redis: { host: '127.0.0.1', port: 6379 }});
// معالجimageQueue.process(async (job) => { const { filename } = job.data; console.log(`معالجة الصورة: ${filename}`); // محاكاة المعالجة await new Promise(resolve => setTimeout(resolve, 2000)); return { processed: true };});
// إضافة مهمةimageQueue.createJob({ filename: 'photo.jpg'}) .retries(2) .del