مجدول المهام في Node.js: node-cron و node-schedule و Bull

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

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

ابدأ الدورة

مجدول المهام في Node.js: نظرة عامة على المكتبات node-cron و node-schedule و Bull



في تطوير الويب الحديث باستخدام Node.js، غالبًا ما تنشأ الحاجة لتنفيذ الكود وفقًا لجدول زمني أو بتأخير. سواء كان ذلك إرسال النشرات البريدية، أو تنظيف ذاكرة التخزين المؤقت، أو إنشاء التقارير، أو مزامنة البيانات - لا يمكن الاستغناء عن مجدول مهام موثوق. في هذه المقالة، سنستعرض ثلاث أدوات شائعة: node-cron و node-schedule و Bull. ستتعرف على ميزاتها، وأمثلة على استخدامها، وستفهم أي منها تختار لمهمتك.



1. node-cron - أداة Cron الكلاسيكية لـ Node.js

node-cron هي مكتبة بسيطة تنفذ صيغة مجدول Unix cron. إنها مثالية للمهام المتكررة البسيطة.



التثبيت

npm install node-cron


مثال: مهمة يتم تنفيذها كل دقيقة

const cron = require('node-cron');

cron.schedule('* * * * *', () => { console.log('المهمة تُنفذ كل دقيقة');});


تنسيق تعبير cron

يتكون التعبير من 5 حقول:

  • الثانية (0-59، اختياري)
  • الدقيقة (0-59)
  • الساعة (0-23)
  • يوم الشهر (1-31)
  • الشهر (1-12)
  • يوم الأسبوع (0-7، 0 و 7 = الأحد)


مثال متقدم: يوميًا في الساعة 8:30 صباحًا

cron.schedule('30 8 * * *', () => {  // إرسال الإحصائيات الصباحية  sendMorningReport();});


الميزات

  • دعم المناطق الزمنية عبر الخيار timezone
  • إمكانية بدء وإيقاف المهام
  • خفيفة الوزن (~20 كيلوبايت)
  • غير مناسبة للمنطق المعقد مع قوائم الانتظار


2. node-schedule - مجدول مرن بقواعد متكررة

node-schedule يوفر واجهة برمجة تطبيقات أكثر ثراءً: يمكنك تحديد الجدول الزمني عبر كائنات، وليس فقط سلاسل cron. هذا مفيد للسيناريوهات المعقدة (مثل "كل ثلاثاء ثاني من الشهر في الساعة 15:00").



التثبيت

npm install node-schedule


مثال: مهمة بتعبير cron

const schedule = require('node-schedule');

const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('تشغيل كل 5 دقائق');});


مثال: قاعدة متكررة عبر كائن

const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [1, 3, 5]; // الإثنين، الأربعاء، الجمعةrule.hour = 10;rule.minute = 30;

schedule.scheduleJob(rule, () => { console.log('مهمة في أيام العمل في الساعة 10:30');});


مثال: تشغيل مؤجل

const date = new Date(Date.now() + 5000); // بعد 5 ثوانٍschedule.scheduleJob(date, () => {  console.log('مهمة لمرة واحدة بعد 5 ثوانٍ');});


الميزات

  • تحديد قواعد مرنة (أيام الأسبوع، الأشهر، النطاقات)
  • دعم المهام لمرة واحدة حسب التاريخ
  • إمكانية إلغاء المهمة: job.cancel()
  • لا يدعم التجميع (clustering) وقوائم الانتظار


3. Bull - قائمة انتظار قوية مع مجدول وإعادة محاولة

Bull ليس مجرد مجدول، بل هو نظام قوائم انتظار كامل يعتمد على Redis. إنه مثالي لبيئات الإنتاج: يدعم المهام المؤجلة، وإعادة المحاولة عند الأخطاء، والأولويات، والمعالجة المتوازية.



التثبيت

npm install bull# يتطلب تثبيت Redis


مثال: مهمة بسيطة مع تأخير

const Queue = require('bull');const myQueue = new Queue('myQueue', 'redis://127.0.0.1:6379');

// إضافة مهمة مع تأخير ساعة واحدةmyQueue.add({ email: 'user@example.com' }, { delay: 3600000 });

// المعالجmyQueue.process(async (job) => { console.log(`إرسال بريد إلكتروني إلى ${job.data.email}`); await sendEmail(job

توصيات