ما هو Bull ولماذا هو مطلوب؟
Bull هي واحدة من أشهر المكتبات لإدارة قوائم انتظار المهام (job queues) في بيئة Node.js. وهي مبنية على Redis وتسمح بمعالجة المهام الخلفية بكفاءة، وتوزيع الحمل بين العمال (workers) وإدارة أولويات التنفيذ. إذا كان تطبيقك يحتاج إلى تنفيذ عمليات تستهلك موارد كثيرة (إرسال البريد الإلكتروني، إنشاء PDF، معالجة الصور، تحليل البيانات) بشكل غير متزامن دون حظر التدفق الرئيسي للطلبات، فإن Bull هو الحل الأمثل.
التثبيت
لتثبيت Bull، ستحتاج إلى خادم Redis قيد التشغيل مسبقًا. يتم تثبيت المكتبة نفسها عبر npm:
npm install bullتأكد أيضًا من أن Redis متاح على العنوان localhost:6379 أو قم بتحديد معلمات الاتصال الخاصة بك.
الوظائف الأساسية
- إنشاء قائمة انتظار — يكفي تهيئة كائن باسم القائمة.
- إضافة المهام (jobs) — يمكن تمرير أي كائنات JavaScript كبيانات للمهمة.
- المعالجات (processors) — دالة يتم تنفيذها لكل مهمة.
- إعادة المحاولة (retries) — إعادة تلقائية عند حدوث أخطاء.
- التأخيرات (delays) — تشغيل المهمة بشكل مؤجل.
- الأولويات — تتم معالجة المهام ذات الأولوية العالية أولاً.
- الأحداث — يمكن الاستماع لأحداث الإكمال، الأخطاء، التقدم.
- الإيقاف المؤقت/الاستئناف — إيقاف قائمة الانتظار مؤقتًا.
مثال كود بلغة JavaScript (Node.js)
مثال بسيط لقائمة انتظار لإرسال البريد الإلكتروني:
const Queue = require('bull');
// إنشاء قائمة انتظارconst emailQueue = new Queue('email', 'redis://127.0.0.1:6379');
// إضافة مهمةemailQueue.add({ to: 'user@example.com', subject: 'مرحباً!', body: 'هذه رسالة اختبارية'}, { attempts: 3, // حتى 3 محاولات عند الخطأ delay: 5000 // تأخير لمدة 5 ثوانٍ});
// معالج المهمةemailQueue.process(async (job) => { console.log('جاري إرسال البريد:', job.data.to); // هنا استدعاء دالة إرسال البريد الإلكتروني الخاصة بك // await sendEmail(job.data); console.log('تم إرسال البريد بنجاح'); return Promise.resolve();});
// حدث عند النجاحemailQueue.on('completed', (job) => { console.log(`المهمة ${job.id} مكتملة`);});
// حدث عند الخطأemailQueue.on('failed', (job, err) => { console.error(`المهمة ${job.id} فشلت: ${err.message}`);});متى تستخدم Bull
يوصى باستخدام Bull في السيناريوهات التالية:
- المهام الخلفية — إرسال الإشعارات، النشرات البريدية، إنشاء التقارير.
- معالجة الوسائط — تغيير حجم الصور، تحويل الفيديو.
- Web scraping — جمع البيانات في الخلفية دون حظر API.
- التكامل مع الخدمات الخارجية — مزامنة البيانات، استدعاء APIs خارجية.
- المعالجة الموزعة — تشغيل عدة عمال على خوادم مختلفة.
بفضل استخدام Redis، فإن قائمة انتظار Bull مقاومة للأعطال: إذا تعطل العامل، فلن تُفقد المهمة وستُنفذ بواسطة عملية أخرى. وهذا يجعل المكتبة خيارًا موثوقًا للأنظمة الإنتاجية (production).