مجدول المهام في Node.js: نظرة عامة وأمثلة على الاستخدام
في تطوير الواجهة الخلفية الحديثة، غالبًا ما تنشأ الحاجة لتنفيذ الكود وفقًا لجدول زمني: إرسال النشرات البريدية، تنظيف ذاكرة التخزين المؤقت، إنشاء نسخ احتياطية لقواعد البيانات أو تحديث البيانات المجمعة. في نظام Node.js البيئي، توجد عدة مكتبات ناضجة لهذه الأغراض. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية لجدولة المهام: cron الكلاسيكي، الجدولة المرنة، وقوائم انتظار المهام.
1. node-cron — cron الكلاسيكي لـ JavaScript
node-cron هي مكتبة بسيطة تسمح بتشغيل الدوال وفقًا لتعبيرات cron القياسية. إنها مثالية للمهام الدورية البسيطة (كل دقيقة، كل ساعة، كل يوم في الساعة 3:00).
التثبيت:
npm install node-cronمثال لمهمة تُنفذ كل دقيقة:
const cron = require('node-cron');
cron.schedule('* * * * *', () => { console.log('المهمة تُنفذ كل دقيقة');});هيكل تعبير cron: ثانية دقيقة ساعة يوم_شهر شهر يوم_أسبوع (في node-cron، الثانية اختيارية).
أمثلة على التعبيرات:
'0 0 * * *'— كل يوم عند منتصف الليل'*/5 * * * *'— كل 5 دقائق'0 9-18 * * 1-5'— كل ساعة من 9 إلى 18 في أيام العمل'30 3 * * 0'— كل يوم أحد في الساعة 3:30
تدعم المكتبة التحقق من صحة التعبيرات وتشغيل/إيقاف المهام:
const task = cron.schedule('*/10 * * * *', () => { // مهمة كل 10 دقائق});
// إيقاف المهمةtask.stop();
// استئنافهاtask.start();
// التحقق مما إذا كانت المهمة نشطةconsole.log(task.isStarted()); // true/falseمتى تستخدم: للإجراءات الدورية البسيطة التي لا تتطلب تخزين حالة أو معالجة أخطاء.
2. node-schedule — جدولة مرنة مع دعم القواعد المتكررة
node-schedule هو بديل أكثر قوة يسمح بتعيين الجدول ليس فقط عبر cron، ولكن أيضًا عبر كائنات JavaScript مع تحديد واضح للتواريخ وأيام الأسبوع والوقت.
التثبيت:
npm install node-scheduleمثال مع تعبير cron:
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('يُتنفذ كل 5 دقائق');});الميزة الرئيسية هي إمكانية تعيين الجدول عبر كائن:
const job = schedule.scheduleJob({ hour: 14, minute: 30, dayOfWeek: [1, 3, 5] // الاثنين، الأربعاء، الجمعة}, () => { console.log('14:30 في أيام العمل');});كما يمكن جدولة مهمة لمرة واحدة في تاريخ محدد:
const date = new Date(2025, 11, 31, 23, 59, 0);
schedule.scheduleJob(date, () => { console.log('حلّت السنة الجديدة!');});تدعم المكتبة إلغاء المهمة والتحقق من وقت التنفيذ التالي:
// إلغاء المهمةjob.cancel();
// الحصول على تاريخ التنفيذ التاليconsole.log(job.nextInvocation()); // كائن Dateمتى تستخدم: عندما تحتاج إلى تحكم دقيق في الوقت، أو دمج القواعد، أو مهام لمرة واحدة.
3. Bull — قوائم انتظار المهام مع الجدولة وإعادة المحاولة
Bull هو نظام قوائم انتظار كامل يعتمد على Redis، ويتضمن جدولة قوية. يسمح Bull ليس فقط بتأجيل المهام، ولكن أيضًا بإدارة إعادة المحاولة والأولويات والتنفيذ المتوازي.
التثبيت:
npm install bullمثال أساسي لقائمة انتظار مع مهمة مؤجلة:
const Queue = require('bull');
const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 63