قوائم المهام لـ TypeScript: دليل شامل لـ Bull و Bee-Queue
عند تطوير تطبيقات الويب الحديثة باستخدام TypeScript، غالبًا ما تنشأ الحاجة لتنفيذ عمليات طويلة أو كثيفة الاستخدام للموارد بشكل غير متزامن، دون حظر التدفق الرئيسي. على سبيل المثال: إرسال إشعارات البريد الإلكتروني، إنشاء تقارير PDF، معالجة الصور أو المزامنة مع واجهات برمجة التطبيقات الخارجية. لحل هذه المشكلات، تُستخدم قوائم المهام (job queues). في هذه المقالة، سنستعرض بالتفصيل أشهر مكتبتين لـ TypeScript — Bull و Bee-Queue، بالإضافة إلى كيفية دمجها في مشروعك.
لماذا نحتاج إلى قوائم المهام؟
تتيح قائمة المهام ما يلي:
- تقسيم المسؤوليات — الخدمة الرئيسية مسؤولة فقط عن إضافة المهمة، بينما المعالج مسؤول عن تنفيذها.
- إدارة الحمل — يمكن تحديد عدد المهام المتوازية (concurrency).
- ضمان التسليم — لا تُفقد المهام حتى في حالة تعطل العملية (بفضل Redis).
- جدولة التنفيذ — تأجيل مهمة لوقت محدد أو تكرارها وفقًا لجدول زمني.
- معالجة الأخطاء — محاولات إعادة تلقائية (retry) مع تأخير تصاعدي.
Bull — قائمة المهام الأكثر شيوعًا لـ Node.js و TypeScript
Bull هي مكتبة قوية تعتمد على Redis، وتدعم مجموعة كاملة من الميزات: الأولويات، إعادة المحاولة، التأخيرات، الإيقاف المؤقت، الأحداث والمراقبة. تتمتع Bull بكتابة أنواع ممتازة لـ TypeScript.
التثبيت والإعداد
npm install bull @types/bullمثال بسيط لقائمة مهام لإرسال البريد الإلكتروني:
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// إنشاء قائمة مهام باسم 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // حتى 3 محاولات backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// المعالج — يتم تنفيذه في الخلفيةemailQueue.process(async (job) => { console.log(`جارٍ إرسال البريد الإلكتروني إلى ${job.data.to}`); // محاكاة الإرسال await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`تم إرسال البريد الإلكتروني: ${job.data.subject}`);});
// إضافة مهمةasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: 'مرحبًا من قائمة المهام!', body: 'هذه رسالة اختبارية.', });}
addEmail();الإمكانيات المتقدمة لـ Bull
- المهام المتكررة (cron):
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - الأولويات:
queue.add(data, { priority: 1 })— كلما قل الرقم، زادت الأولوية. - تأخير التنفيذ:
queue.add(data, { delay: 60000 })— تأجيل لمدة دقيقة واحدة. - الأحداث: يمكن الاشتراك في
completedوfailedوprogressوغيرها. - الإيقاف المؤقت/الاستئناف:
queue.pause()/queue.resume().
// معالجة الأحداثemailQueue.on('completed', (job, result) => { console.log(`المهمة ${job.id} اكتملت`);});
emailQueue.on('failed', (job, err) => { console.error(`المهمة ${job.id} فشلت: ${err.message}`);});Bee-Queue — بديل خفيف الوزن
Bee-Queue هي قائمة مهام بسيطة تعتمد على Redis، وهي أبسط وأسرع من Bull من حيث استهلاك الذاكرة. مناسبة للمشاريع الصغيرة أو الحالات التي لا تحتاج إلى إعدادات معقدة.
التثبيت والمثال
npm install bee-queueimport Bee from 'bee أيضاً في المكتبة
إطار CLI لـ Rust: Clap — أداة قوية ومريحة لإنشاء تطبيقات وحدة التحكم
الموقع الجغرافي والخرائط في Swift: CoreLocation وMapKit لنظامي iOS/macOS
مجدول مهام Swift: GCD وOperationQueue وTimer على iOS/macOS
ORM لـ C# (.NET): مقارنة Entity Framework و Dapper و NHibernate
SwiftyJSON لـ Swift: دليل شامل مع أمثلة تطبيقية