قوائم المهام لـ TypeScript: Bull وAgenda وBee-Queue
في تطبيقات الويب الحديثة بلغة TypeScript، غالبًا ما تنشأ الحاجة لتنفيذ عمليات كثيفة الاستخدام للموارد أو طويلة الأمد بشكل غير متزامن، دون حظر الخيط الرئيسي. قوائم المهام (Job Queues) هي نمط معماري مثبت يسمح بتأجيل تنفيذ المهام، وتوزيع الحمل بين العمال (workers)، وضمان موثوقية المعالجة. في هذه المقالة، سنستعرض ثلاث أدوات شائعة لـ TypeScript: Bull وAgenda وBee-Queue. ستتعرف على كيفية دمجها في مشروعك، ونقاط قوتها، والأداة المناسبة لكل سيناريو.
1. Bull — قائمة مهام قوية تعتمد على Redis
Bull هي على الأرجح المكتبة الأكثر شيوعًا لإدارة قوائم المهام في Node.js/TypeScript. تستخدم Redis كخلفية (backend)، مما يضمن أداءً عاليًا ومقاومة للأعطال. تدعم Bull أولويات المهام، وإعادة المحاولات، والتأخيرات، بالإضافة إلى سيناريوهات معقدة مع إيقاف واستئناف القائمة.
التثبيت:
npm install bullnpm install @types/bull // لـ TypeScriptمثال بسيط لمنتج-مستهلك (producer-consumer):
import Queue from 'bull';
// إنشاء قائمة مهام باسم 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Producer: إضافة مهمةasync function sendWelcomeEmail(userId: string) { await emailQueue.add( { userId, type: 'welcome' }, { attempts: 3, backoff: 2000 } // 3 محاولات مع تأخير 2 ثانية );}
// Consumer: معالجة المهمةemailQueue.process(async (job) => { const { userId, type } = job.data; console.log(`إرسال بريد ${type} إلى المستخدم ${userId}`); // هنا منطق إرسال البريد الإلكتروني});توفر Bull أيضًا واجهة مراقبة (UI) مريحة عبر bull-board أو bull-repl، مما يسهل التصحيح في بيئة الإنتاج.
2. Agenda — قائمة مهام مرنة مع دعم الجداول الزمنية
Agenda هي مكتبة تستخدم MongoDB كمخزن. ميزتها الرئيسية هي الدعم المدمج للمهام الدورية (جداول زمنية تشبه cron) وواجهة برمجة تطبيقات (API) مريحة لتحديد المهام المتكررة. Agenda مناسبة تمامًا للمهام التي يجب تنفيذها وفقًا لجدول زمني: تنظيف قاعدة البيانات، إنشاء التقارير، إرسال النشرات البريدية.
التثبيت:
npm install agendanpm install @types/agendaمثال استخدام مع جدول زمني:
import Agenda from 'agenda';
const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda-example' }});
// تعريف المهمةagenda.define('send weekly report', async (job) => { const { department } = job.attrs.data; console.log(`إنشاء تقرير أسبوعي لقسم ${department}`);});
// تشغيل الوكيل (agent) وجدولة المهمة(async () => { await agenda.start(); // التنفيذ كل يوم جمعة الساعة 18:00 await agenda.every('0 18 * * 5', 'send weekly report', { department: 'IT' });})();تدعم Agenda الأولويات، وإعادة المحاولات، والإغلاق الآمن (graceful shutdown). ومع ذلك، فهي أقل أداءً من Bull بسبب استخدام MongoDB بدلاً من Redis.
3. Bee-Queue — قائمة مهام خفيفة وسريعة
Bee-Queue هي قائمة مهام بسيطة تعتمد على Redis، وتركز على أقصى أداء وحجم صغير للكود. لا تدعم وظائف معقدة مثل الأولويات أو الجداول الزمنية، لكنها مثالية للسيناريوهات البسيطة حيث تكون السرعة وانخفاض استهلاك الذاكرة مهمين.
التثبيت:
npm install bee-queuenpm install @types/bee-queueمثال على العمل:
import Bee from 'bee-queue';
const imageQueue = new Bee('image-processing', { redis: { host: 'localhost', port: 6379 }});
// ProducerimageQueue.createJob({ أيضاً في المكتبة
إطار عمل CLI لجافا سكريبت (Node.js): Commander.js – إنشاء تطبيقات وحدة التحكم
PDFKit لجافا سكريبت (Node.js): دليل شامل مع أمثلة عملية
تحديد المعدل (Rate Limiting) في Go (Golang): المكتبات والأنماط وأمثلة التنفيذ
gRPC في Rust: مكتبات Tonic و Grpc-rs مع أمثلة
Typegoose لـ TypeScript: دليل شامل مع أمثلة عملية