قوائم المهام في JavaScript (Node.js): دليل شامل للمبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج إلى قوائم المهام في JavaScript؟

\n

في تطوير الويب الحديث، غالبًا ما تواجه التطبيقات مهامًا لا يمكن تنفيذها فورًا ضمن طلب HTTP واحد. إرسال رسائل البريد الإلكتروني، معالجة الصور، إنشاء تقارير PDF أو المزامنة مع واجهات برمجة التطبيقات الخارجية - كل هذه الأمور تستغرق وقتًا وقد تؤدي إلى "تعليق" الخادم إذا تم تنفيذها بشكل متزامن.

\n

قوائم المهام (Task Queues) تحل هذه المشكلة. فهي تسمح بتأجيل تنفيذ العمليات كثيفة الاستخدام للموارد ومعالجتها بشكل غير متزامن في الخلفية. في هذه المقالة، سنشرح كيفية إنشاء وإدارة قوائم المهام في بيئة Node.js باستخدام المكتبات الشائعة.

\n\n

1. أساسيات العمل مع القوائم في Node.js

\n

قائمة المهام هي بنية بيانات تعمل وفق مبدأ FIFO (أول من يدخل، أول من يخرج). يتم إضافة المهام إلى نهاية القائمة، ويتم معالجتها من البداية. في سياق Node.js، هذا يعني أن الخادم الخاص بك يمكنه الرد بسرعة على المستخدم ("تم استلام المهمة للمعالجة")، بينما سيتم تنفيذ المهمة نفسها لاحقًا.

\n

للعمل مع القوائم في Node.js، يتم استخدام مكتبات متخصصة تعتمد على مخازن خارجية (غالبًا Redis). دعنا نلقي نظرة على الأكثر شيوعًا:

\n
    \n
  • Bull - مكتبة حديثة وسريعة ومستقرة تعتمد على Redis.
  • \n
  • Kue - مكتبة أقدم ولكنها لا تزال شائعة مع واجهة ويب مدمجة.
  • \n
\n

سنركز على Bull لأنها أصبحت المعيار الفعلي للمشاريع الجديدة.

\n\n

1.1 تثبيت واستخدام Bull

\n

للبدء، قم بتثبيت التبعيات اللازمة:

\n
npm install bull ioredis
\n

الآن لننشئ قائمة بسيطة:

\n
const Queue = require('bull');\nconst myQueue = new Queue('emailQueue', {\n  redis: {\n    host: '127.0.0.1',\n    port: 6379\n  }\n});\n\n// إضافة مهمة إلى القائمة\nmyQueue.add({\n  to: 'user@example.com',\n  subject: 'رسالة ترحيبية',\n  body: 'مرحبًا بك في موقعنا!'\n});\n\nconsole.log('تمت إضافة المهمة إلى القائمة');
\n

في هذا المثال، أنشأنا قائمة باسم emailQueue وأضفنا إليها مهمة واحدة - إرسال بريد إلكتروني. المهمة لم يتم تنفيذها بعد، إنها فقط تنتظر معالجها.

\n\n

2. معالجة المهام من القائمة

\n

لكي تبدأ المهام في التنفيذ، نحتاج إلى معالج (consumer). سيقوم "بالاستماع" إلى القائمة وأخذ المهام منها للتنفيذ.

\n

لننشئ ملف worker.js:

\n
const Queue = require('bull');\nconst emailQueue = new Queue('emailQueue', {\n  redis: { host: '127.0.0.1', port: 6379 }\n});\n\n// دالة المعالجة\nemailQueue.process(async (job) => {\n  const { to, subject, body } = job.data;\n  console.log(`جارٍ إرسال البريد الإلكتروني إلى ${to}...`);\n  \n  // محاكاة إرسال البريد الإلكتروني (في مشروع حقيقي سيكون هناك nodemailer)\n  await new Promise(resolve => setTimeout(resolve, 2000));\n  \n  console.log(`تم إرسال البريد الإلكتروني "${subject}" إلى ${to}`);\n  return { status: 'sent', email: to };\n});\n\nconsole.log('تم تشغيل المعالج وهو ينتظر المهام...');
\n

قم بتشغيل هذا السكريبت، ثم أضف مهمة من المثال الأول. سترى كيف تتم معالجة المهمة.

\n\n

2.1 معالجة الأخطاء وإعادة المحاولة

\n

في المشاريع الحقيقية، قد تفشل المهام (على سبيل المثال، خادم SMTP غير متاح). يوفر Bull آلية مدمجة لإعادة المحاولة:

\n
emailQueue.add(\n  { to: 'user@example.com', subject: 'رسالة مهمة' },\n  { \n    attempts: 5,          // عدد المحاولات\n    backoff: { type: 'exponential', delay: 2000 } // تأخير أسي\n  }\n);\n\n// في المعالج يمكن معالجة الفشل\nemailQueue.on('failed', (job, err) => {\n  console.error(`فشلت المهمة ${job.id}: ${err.message}`);\n});
\n\n

3. الميزات المتقدمة للقوائم

\n

يوفر Bull العديد من الوظائف المفيدة لإدارة المهام.

\n\n

3.1 أولويات المهام

المدونات

توصيات الكتب