بصفتك مطور ويب ، من الأهمية بمكان أن تعمل تطبيقاتك بأسرع ما يمكن. يجب عليك إنشاء تطبيقات الويب التي تستجيب للطلبات في أسرع وقت ممكن.
واحدة من العديد من التقنيات التي يمكن أن تساعدك في قائمة انتظار المهام.
إذن ، ما هي قائمة انتظار المهام ، وكيف يمكنك استخدامها لتحسين تطبيق Node.js؟
ما هي مهمة وضع قائمة الانتظار؟
انتظار الرسائل هو وسيلة اتصال غير متزامن بين تطبيقين أو خدمتين ، يشار إليها عادةً باسم منتج و مستهلك. إنه مفهوم معروف جيدًا يتم استخدامه في بنى الخدمات المصغرة وبدون خادم.
مفهوم مهمة أو وظيفةالطابور يستفيد من قائمة انتظار الرسائل لتحسين أداء التطبيق. إنها تلخص تعقيدات إدارة الرسائل وتمكنك من تحديد وظائف لإدارة الوظائف أو المهام بشكل غير متزامن باستخدام قائمة انتظار ، وبالتالي تقليل معدل استخدام الذاكرة في بعض أجزاء التطبيق.
المثال الأكثر شيوعًا لبرنامج قائمة انتظار الرسائل هو RabbitMQ. تتضمن أدوات قائمة انتظار المهام الكرفس والثور. يمكنك أيضًا تكوين RabbitMQ للعمل كقائمة انتظار مهام. تابع القراءة للتعرف على مهام قائمة انتظار في Node.js باستخدام Bull.
ما هو BullMQ؟
BullMQ (Bull.js) هي مكتبة Node.js تستخدم لتنفيذ قوائم الانتظار في تطبيقات Node. Bull هو نظام مبني على Redis (قد تكون أكثر دراية بـ Redis كأداة لـ تخزين البيانات بسرعة) وهو خيار سريع وموثوق يجب مراعاته في قائمة انتظار المهام في Node.js.
يمكنك استخدام Bull للعديد من المهام مثل تنفيذ الوظائف المتأخرة والوظائف المجدولة والمهام القابلة للتكرار وقوائم الانتظار ذات الأولوية وغير ذلك الكثير.
إذن ، كيف يمكنك استخدام Bull و Redis لتشغيل مهام Node.js بشكل غير متزامن؟
كيفية تكوين Bull و Redis لوضع المهام في قائمة انتظار في Node.js
لبدء قائمة انتظار المهام في Node.js مع Bull ، تحتاج إلى تثبيت Node.js و Redis على جهازك. يمكنك متابعة دليل مختبرات Redis لتثبيت Redis إذا لم يكن مثبتًا لديك.
تتمثل الخطوة الأولى لتطبيق Bull في إضافته إلى تبعيات مشروعك عن طريق التشغيل npm تثبيت الثور أو إضافة الغزل الثور في الجهاز داخل مجلد مشروعك. توجد طرق متعددة لتهيئة قائمة انتظار في Bull كما هو موضح أدناه:
مقدار ثابت قائمة الانتظار = يتطلب('ثور');
// طرق مختلفة لتهيئة قائمة انتظار
// - باستخدام سلسلة عنوان URL لـ redis
مقدار ثابت emailQueue = جديد طابور("قائمة انتظار البريد الإلكتروني", "redis: //127.0.0.1: 6379");// - مع اتصال redis وكائن خيارات قائمة الانتظار
مقدار ثابت videoQueue = جديد طابور("قائمة انتظار الفيديو", "redis: //127.0.0.1: 6379"، queueOptions) ؛// - بدون اتصال redis ولكن مع queueOption
مقدار ثابت docQueue = جديد طابور("قائمة انتظار المستندات"، queueOptions) ؛
// - بدون اتصال redis أو خيارات قائمة الانتظار
مقدار ثابت QueueClient = جديد طابور("قائمة الانتظار");
كل هذه تستخدم الحد الأدنى من التكوين للثور في Node.js. يدعم كائن الخيارات العديد من الخصائص ويمكنك التعرف عليها في ملف قسم خيارات قائمة الانتظار في وثائق الثور.
تنفيذ قائمة انتظار مهام البريد الإلكتروني باستخدام BullMQ
لتنفيذ قائمة انتظار لإرسال رسائل البريد الإلكتروني ، يمكنك تحديد وظيفة المنتج التي تضيف رسائل البريد الإلكتروني إلى قائمة انتظار البريد الإلكتروني ، ووظيفة المستهلك للتعامل مع إرسال رسائل البريد الإلكتروني.
أولاً ، يمكنك تهيئة قائمة الانتظار في الفصل باستخدام عنوان URL Redis وبعض خيارات قائمة الانتظار كما هو موضح أدناه.
// queueHandler.js
مقدار ثابت قائمة الانتظار = يتطلب('ثور');// استخدم وحدة معالجة بريد إلكتروني حقيقية هنا - هذا مجرد مثال
مقدار ثابت emailHandler = يتطلب("./emailHandler.js");// تحديد الثوابت وعنوان URL لـ Redis وخيارات قائمة الانتظار
مقدار ثابت REDIS_URL = "redis: //127.0.0.1: 6379";مقدار ثابت queueOpts = {
// خيارات محدد المعدل لتجنب التحميل الزائد على قائمة الانتظار
المحدد: {
// الحد الأقصى لعدد المهام التي يمكن أن تستغرقها قائمة الانتظار
الأعلى: 100,// وقت الانتظار بالمللي ثانية قبل قبول الوظائف الجديدة بعد ذلك
// الوصول إلى الحد
مدة: 10000
},
بادئة: "مهمة البريد الإلكتروني", // بادئة تضاف إلى جميع مفاتيح الطابور
defaultJobOptions: { // الخيارات الافتراضية للمهام في قائمة الانتظار
المحاولات: 3, // عدد المرات الافتراضي لإعادة محاولة مهمة// لإزالة مهمة من قائمة الانتظار بعد الانتهاء
إزالة عند الاكتمال: حقيقي
}
};فصلالبريد الإلكتروني{
البناء() {
هذا.queue = جديد طابور("قائمة انتظار البريد الإلكتروني"، REDIS_URL ، queueOpts) ،
}
};
يصدّرتقصير البريد الإلكتروني // تصدير الفئة
الآن بعد أن قمت بتهيئة قائمة انتظار ، يمكنك تحديد وظيفة المنتج (باستخدام Bull's يضيف() وظيفة) كطريقة من البريد الإلكتروني فئة لإضافة رسائل بريد إلكتروني إلى قائمة انتظار المهام. يوضح مقطع التعليمات البرمجية التالي هذا:
// queueHandler.js
فصلالبريد الإلكتروني{
البناء () {
// ...
}// وظيفة المنتج لإضافة رسائل البريد الإلكتروني إلى قائمة الانتظار
غير متزامن addEmailToQueue (بيانات البريد الإلكتروني) {
// إضافة مهمة باسم "email_notification" إلى قائمة الانتظار
انتظرهذا.queue.add ("إشعار_البريد الإلكتروني"، بيانات البريد الإلكتروني) ؛
وحدة التحكم.سجل("تمت إضافة البريد الإلكتروني إلى قائمة الانتظار ...");
}
};
يصدّرتقصير البريد الإلكتروني // تصدير الفئة
وظيفة المنتج جاهزة ، ويمكنك الآن تحديد وظيفة المستهلك (باستخدام Bull's عملية() الدالة) لمعالجة جميع مهام البريد الإلكتروني في قائمة الانتظار ، أي استدعاء الوظيفة لإرسال بريد إلكتروني. يجب عليك تحديد وظيفة المستهلك هذه في مُنشئ الفئة.
// queueHandler.js
فصلالبريد الإلكتروني{
البناء () {
// ...// وظيفة المستهلك التي تأخذ الاسم المخصص للمهمة و
// وظيفة رد
هذا.queue.process ("إشعار_البريد الإلكتروني", غير متزامن (emailJob ، تم) => {
وحدة التحكم.سجل("معالجة مهمة إعلام البريد الإلكتروني");
انتظر emailHandler.sendEmail (emailJob) ؛ // أرسل البريد الإلكتروني
منتهي()؛ // اكمل المهمة
})
}
// ...
};
يصدّرتقصير البريد الإلكتروني // تصدير الفئة
قد يكون للوظيفة أيضًا خيارات لتحديد سلوكها في قائمة الانتظار أو كيفية تعامل وظيفة المستهلك معها. يمكنك معرفة المزيد عن هذا في قسم خيارات العمل في وثائق Bull's.
ال الوظيفة الوسيطة هي كائن يحتوي على خصائص المهمة التي تقوم قائمة الانتظار بمعالجتها. يتضمن أيضًا البيانات الرئيسية اللازمة لإنشاء البريد الإلكتروني. لسهولة الفهم ، فإن ارسل بريد الكتروني() ستكون الوظيفة مشابهة لهذا المثال:
// emailHandler.js
مقدار ثابت SendgridMail = يتطلب("@ sendgrid / mail");مقدار ثابت apiKey = process.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey) ، // تعيين بيانات اعتماد أمان ناقل البريد الإلكتروني
مقدار ثابت أرسل البريد الإلكتروني = غير متزامن (emailJob) => {
يحاول {
// استخراج بيانات البريد الإلكتروني من الوظيفة
مقدار ثابت {الاسم ، البريد الإلكتروني} = emailJob.data ؛مقدار ثابت الرسالة = {
من: "[email protected]",
ل: "[email protected]",
موضوع: 'أهلاً! مرحباً',
نص: مرحبا $ {name}، مرحبا بكم في MUO`
};انتظر sendgridMail.sendMail (رسالة) ، // ارسل بريد الكتروني
// علامة المهمة على أنها مكتملة في قائمة الانتظار
انتظر EmailJob.moveToCompleted ('منتهي', حقيقي);
وحدة التحكم.سجل("تم إرسال البريد الإلكتروني بنجاح ...");
} يمسك (خطأ) {
// نقل المهمة إلى الوظائف الفاشلة
انتظر emailJob.moveToFailed ({ رسالة: "فشل معالجة المهمة .." });
وحدة التحكم. Error (error)؛ // سجل الخطأ
}
}
يصدّرتقصير ارسل بريد الكتروني؛
الآن بعد أن تم تحديد وظائف المنتج والمستهلك وجاهزة للاستخدام ، يمكنك الآن الاتصال بوظيفة المنتج في أي مكان في التطبيق الخاص بك لإضافة بريد إلكتروني إلى قائمة الانتظار للمعالجة.
سيبدو مثال وحدة التحكم بالشكل التالي:
// userController.js
مقدار ثابت EmailQueue = يتطلب("../handlers/queueHandler.js")مقدار ثابت تسجيل = غير متزامن (مطلوب ، الدقة) => {
مقدار ثابت {الاسم ، البريد الإلكتروني ، كلمة المرور} = req.body ؛// --
// استعلام لإضافة المستخدم الجديد إلى قاعدة البيانات ...
// --// إضافة إلى قائمة انتظار البريد الإلكتروني
مقدار ثابت emailData = {name، email} ؛
انتظر EmailQueue.addEmailToQueue (emailData) ،
res.status (200) .json ({
رسالة: "تم الاشتراك بنجاح ، يرجى التحقق من بريدك الإلكتروني"
})
}
لك queueHandler.js يجب أن يكون الملف الآن على النحو التالي:
// queueHandler.js
مقدار ثابت قائمة الانتظار = يتطلب('ثور');
مقدار ثابت emailHandler = يتطلب("../handlers/emailHandler.js");مقدار ثابت REDIS_URL = "redis: //127.0.0.1: 6379";
مقدار ثابت queueOpts = {
المحدد: {
الأعلى: 100,
مدة: 10000
},بادئة: "مهمة البريد الإلكتروني",
defaultJobOptions: {
المحاولات: 3,
إزالة عند الاكتمال: حقيقي
}
};فصلالبريد الإلكتروني{
البناء() {
هذا.queue = جديد طابور("قائمة انتظار البريد الإلكتروني"، REDIS_URL ، queueOpts) ،// مستهلك
هذا.queue.process ("إشعار_البريد الإلكتروني", غير متزامن (emailJob ، تم) => {
وحدة التحكم.سجل("معالجة مهمة إعلام البريد الإلكتروني");
انتظر emailHandler.sendEmail (emailJob) ؛
منتهي()؛
})
}// منتج
غير متزامن addEmailToQueue (بيانات البريد الإلكتروني) {
// إضافة مهمة باسم "email_notification" إلى قائمة الانتظار
انتظرهذا.queue.add ("إشعار_البريد الإلكتروني"، بيانات البريد الإلكتروني) ؛
وحدة التحكم.سجل("تمت إضافة البريد الإلكتروني إلى قائمة الانتظار ...");
}
};
يصدّرتقصير البريد الإلكتروني
عند تنفيذ ذلك في واجهة برمجة تطبيقات Node.js REST ، ستلاحظ انخفاضًا في وقت استجابة نقطة نهاية التسجيل وأوقات تسليم البريد الإلكتروني بشكل أسرع مقارنة بالبديل البديل.
تمكّنك قوائم انتظار المهام أيضًا من معالجة أخطاء التسجيل والبريد الإلكتروني بشكل مستقل.
تحسين التطبيقات باستخدام قوائم انتظار المهام
تعد قوائم انتظار الرسائل والمهام طريقة رائعة لتحسين الأداء العام للتطبيقات. كما أنها رخيصة جدًا ويمكنك استخدامها في أي عدد تريده من أجزاء التطبيق.
على الرغم من أن هذا البرنامج التعليمي استخدم رسائل البريد الإلكتروني كسيناريو مثال للتعامل مع المهام التي تستهلك الذاكرة مع قوائم الانتظار ، إلا أن هناك العديد من الحالات الأخرى التي يمكنك فيها تطبيق نفس المفاهيم. يتضمن ذلك عمليات قراءة / كتابة مكثفة ، وتقديم صور أو مستندات عالية الجودة ، وإرسال إعلامات مجمعة.