مهام قوائم الانتظار في JavaScript للمبتدئين: دليل شامل

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج إلى قوائم انتظار المهام؟



تخيل أنك تقوم بتشغيل خادم ويب على Node.js. يرسل المستخدم طلبًا لإرسال 1000 رسالة بريد إلكتروني. إذا تمت معالجة هذا الطلب بشكل متزامن، فسيتجمد الخادم لعدة دقائق - ولن يتمكن جميع المستخدمين الآخرين من الحصول على رد.



كيف تحل هذه المشكلة؟ الإجابة هي قوائم انتظار المهام (task queues). فهي تسمح بتأجيل تنفيذ العمليات كثيفة الاستهلاك للموارد (إرسال البريد الإلكتروني، إنشاء PDF، معالجة الصور) وتنفيذها في الخلفية، دون حظر التدفق الرئيسي للتطبيق.



في هذه المقالة، سنتناول:

  • ما هي قائمة انتظار المهام وكيف تعمل
  • المكتبات الشائعة لـ Node.js (Bull, Kue)
  • أمثلة كود: إنشاء المهام وإضافتها ومعالجتها
  • أفضل الممارسات للمبتدئين


1. أساسيات قوائم انتظار المهام في Node.js



ما هي قائمة انتظار المهام؟

قائمة انتظار المهام هي بنية بيانات تعمل وفق مبدأ FIFO (أول من يدخل، أول من يخرج). تتم إضافة المهام إلى نهاية قائمة الانتظار، ويتم معالجتها من البداية. عادةً ما تُبنى قوائم الانتظار على أساس Redis - مخزن سريع للقيم الرئيسية في الذاكرة.



المكونات الرئيسية لقائمة الانتظار:

  • Producer - الكود الذي يضيف المهام إلى قائمة الانتظار
  • Consumer (Worker) - الكود الذي يسحب المهام وينفذها
  • Queue Manager - الآلية التي تدير قائمة الانتظار (عادةً Redis)


المكتبات الشائعة

توجد مكتبتان رئيسيتان لـ Node.js:

  • Bull - حديثة وسريعة وتدعم الأولويات وإعادة المحاولة والتأخير
  • Kue - مكتبة قديمة ولكنها بسيطة (أقل شهرة الآن)

في هذه المقالة، سنركز على Bull لأنها مدعومة بنشاط ولديها إمكانيات أكثر.



2. تثبيت وإعداد Bull



الخطوة 1: تثبيت Redis

يستخدم Bull Redis. إذا لم يكن لديك Redis، فقم بتثبيته:

# macOSbrew install redis

# Ubuntusudo apt-get install redis-server

# تشغيل Redisredis-server


الخطوة 2: تثبيت Bull

أنشئ مشروعًا جديدًا وقم بتثبيت الحزمة:

mkdir queue-democd queue-demonpm init -ynpm install bull


الخطوة 3: الإعداد الأساسي

أنشئ ملف queue.js:

const Queue = require('bull');

// إنشاء قائمة انتظار باسم 'emailQueue'const emailQueue = new Queue('emailQueue', { redis: { host: '127.0.0.1', port: 6379 }});

module.exports = emailQueue;


3. مثال: قائمة انتظار لإرسال البريد الإلكتروني



الخطوة 1: إنشاء Producer (إضافة المهام)

أنشئ ملف producer.js:

const emailQueue = require('./queue');

async function addEmailTask(to, subject, body) { // إضافة مهمة إلى قائمة الانتظار const job = await emailQueue.add({ to: to, subject: subject, body: body }, { // خيارات المهمة attempts: 3, // عدد المحاولات عند الخطأ backoff: 5000, // التأخير بين المحاولات (5 ثوانٍ) delay: 1000 // التأخير قبل التنفيذ (ثانية واحدة) });

console.log(`تمت إضافة المهمة بالمعرف: ${job.id}`); return job;}

// مثال على الاستخدامaddEmailTask('user@example.com', 'مرحبًا!', 'رسالة اختبارية');


الخطوة 2: إنشاء Worker (معالجة المهام)

أنشئ ملف worker.js:

const emailQueue = require('./queue');

// دالة تحاكي إرسال البريد الإلكترونيasync function sendEmail(to, subject, body) { console.log(`جارٍ إرسال البريد الإلكتروني إلى ${to}...`); // محاكاة تأخير await new Promise(resolve => setTimeout(resolve, 2000)); console.log(`تم إرسال البريد الإلكتروني: ${subject}`);}

// معالج قائمة الانتظارemai

المدونات

توصيات الكتب