קוראים כמוך עוזרים לתמוך ב-MUO. כאשר אתה מבצע רכישה באמצעות קישורים באתר שלנו, אנו עשויים להרוויח עמלת שותף. קרא עוד.

כמפתח אינטרנט, חיוני שהאפליקציות שלך יפעלו מהר ככל האפשר. עליך לבנות אפליקציות אינטרנט שיגיבו לבקשות בזמן המהיר ביותר.

אחת מהטכנולוגיות הרבות שיכולות לעזור לך היא עמידה בתור משימות.

אז מה זה תור משימות וכיצד אתה יכול להשתמש בו כדי לייעל יישום Node.js?

מה זה תור משימות?

תור הודעות הוא אמצעי לתקשורת אסינכרונית בין שני יישומים או שירותים, המכונה בדרך כלל יַצרָן ו צרכן. זהו מושג ידוע המופעל בארכיטקטורות ללא שרתים ומיקרו-שירותים.

הקונספט של מְשִׁימָה אוֹ עבודההִזדַנְבוּת ממנפת את תור ההודעות כדי לשפר את ביצועי האפליקציה. זה מפשט את המורכבות של ניהול הודעות ומאפשר לך להגדיר פונקציות לניהול משימות או משימות באופן אסינכרוני באמצעות תור, ובכך להפחית את הקצב של שימוש בזיכרון בחלקים מסוימים של אפליקציה.

הדוגמה הנפוצה ביותר לתוכנת תור הודעות היא RabbitMQ. כלי תור המשימות כוללים סלרי ובול. אתה יכול גם להגדיר את RabbitMQ לעבוד כתור משימות. המשך לקרוא כדי ללמוד על תור משימות ב-Node.js באמצעות Bull.

instagram viewer

מה זה BullMQ?

BullMQ (Bull.js) היא ספריית Node.js המשמשת להטמעת תורים ביישומי Node. בול היא מערכת מבוססת Redis (ייתכן שאתה מכיר יותר את Redis ככלי עבור אחסון נתונים מהיר) וזו אפשרות מהירה ואמינה לשקול עבור תור משימות ב-Node.js.

אתה יכול להשתמש ב-Bull עבור משימות רבות כגון הטמעת עבודות מושהות, עבודות מתוזמנות, עבודות הניתנות לחזרה, תורי עדיפות ועוד רבים נוספים.

אז איך אתה יכול להשתמש ב-Bull ו-Redis כדי להריץ משימות Node.js באופן אסינכרוני?

כיצד להגדיר את Bull ו-Redis לתור משימות ב-Node.js

כדי להתחיל עם תור משימות ב-Node.js עם Bull, אתה צריך את Node.js ו-Redis מותקנים במחשב שלך. אתה יכול לעקוב אחר ה מדריך מעבדות Redis להתקנת Redis אם זה לא מותקן אצלך.

הצעד הראשון ליישום Bull הוא להוסיף אותו לתלות של הפרויקט שלך על ידי הפעלה npm להתקין בול אוֹ חוט להוסיף בול בטרמינל שבתיקיית הפרויקט שלך. ישנן מספר דרכים לאתחל תור בבול כפי שמוצג להלן:

const תור = לִדרוֹשׁ('שׁוֹר');

// דרכים שונות לאתחל תור
// - באמצעות מחרוזת URL של redis
const emailQueue = חָדָשׁ תוֹר('תור דואר אלקטרוני', 'redis://127.0.0.1:6379');

// - עם אובייקט חיבור מחדש ואפשרויות תור
const videoQueue = חָדָשׁ תוֹר('תור וידאו', 'redis://127.0.0.1:6379', queueOptions);

// - ללא חיבור redis אבל עם queueOption
const docQueue = חָדָשׁ תוֹר('תור מסמכים', queueOptions);

// - ללא חיבור מחדש או אפשרויות תור
const QueueClient = חָדָשׁ תוֹר('התור שלי');

כל אלה משתמשים בתצורה מינימלית עבור Bull ב-Node.js. אובייקט האפשרויות תומך במאפיינים רבים ותוכל ללמוד עליהם ב- קטע אפשרויות תור בתיעוד של בול.

יישום תור משימות דוא"ל באמצעות BullMQ

כדי ליישם תור לשליחת מיילים, אתה יכול להגדיר את פונקציית המפיק שלך שמוסיפה מיילים לתור הדוא"ל, ופונקציית צרכן לטיפול בשליחת מיילים.

ראשית, אתה יכול לאתחל את התור שלך בכיתה באמצעות כתובת URL של Redis וכמה אפשרויות תור כפי שנראה להלן.

// queueHandler.js
const תור = לִדרוֹשׁ('שׁוֹר');

// השתמש כאן במודול מטפל אמיתי בדוא"ל - זו רק דוגמה
const emailHandler = לִדרוֹשׁ('./emailHandler.js');

// מגדירים קבועים, כתובת אתר Redis ואפשרויות תור
const REDIS_URL = 'redis://127.0.0.1:6379';

const queueOpts = {
// אפשרויות מגביל קצב כדי למנוע עומס יתר על התור
מגביל: {
// המספר המרבי של משימות שתור יכול לקחת
מקסימום: 100,

// זמן לחכות באלפיות שניות לפני קבלת משרות חדשות לאחר מכן
// מגיע לגבול
מֶשֶׁך: 10000
},
קידומת: 'EMAIL-TASK', // קידומת שתתווסף לכל מפתחות התור
defaultJobOptions: { // אפשרויות ברירת מחדל עבור משימות בתור
ניסיונות: 3, // מספר הפעמים המוגדר כברירת מחדל כדי לנסות שוב משימה

// כדי להסיר משימה מהתור לאחר השלמתה
removeOnComplete: נָכוֹן
}
};

מעמדתור דוא"ל{
בַּנַאִי() {
זֶה.queue = חָדָשׁ תוֹר('תור דואר אלקטרוני', REDIS_URL, queueOpts);
}
};

יְצוּאבְּרִירַת מֶחדָל EmailQueue; // ייצא את המחלקה

כעת, לאחר שאתחלת תור, אתה יכול להגדיר את פונקציית המפיק שלך (באמצעות Bull's לְהוֹסִיף() function) כשיטה של ​​ה תור דוא"ל כיתה כדי להוסיף מיילים לתור המשימות. בלוק הקוד הבא מדגים זאת:

// queueHandler.js

מעמדתור דוא"ל{
בַּנַאִי () {
// ...
}

// פונקציית מפיק להוספת מיילים לתור
אסינכרון addEmailToQueue (emailData) {
// הוסף משימה בשם 'email_notification' לתור
לְהַמתִיןזֶה.queue.add('email_notification', emailData);
לְנַחֵם.עֵץ('המייל התווסף לתור...');
}
};

יְצוּאבְּרִירַת מֶחדָל EmailQueue; // ייצא את המחלקה

פונקציית היצרן מוכנה, וכעת תוכל להגדיר פונקציית צרכן (באמצעות בול'ס תהליך() function) כדי לעבד את כל משימות הדוא"ל בתור - כלומר. התקשר לפונקציה כדי לשלוח אימייל. עליך להגדיר את פונקציית הצרכן הזו בקונסטרוקטור של המחלקה.

// queueHandler.js
מעמדתור דוא"ל{
בַּנַאִי () {
// ...

// פונקציית צרכן שמקבלת את השם שהוקצה למשימה ו
// פונקציית התקשרות חוזרת
זֶה.queue.process('email_notification', אסינכרון (emailJob, done) => {
לְנַחֵם.עֵץ('משימת עיבוד הודעת דוא"ל');
לְהַמתִין emailHandler.sendEmail (emailJob); // שלח את המייל
בוצע(); // להשלים את המשימה
})
}
// ...
};

יְצוּאבְּרִירַת מֶחדָל EmailQueue; // ייצא את המחלקה

לעבודה עשויות להיות גם אפשרויות להגדיר את ההתנהגות שלה בתור או כיצד פונקציית הצרכן מטפלת בה. תוכל לברר על כך יותר ב- קטע אפשרויות עבודה בתיעוד של בול.

ה emailJob ארגומנט הוא אובייקט המכיל את המאפיינים של המשימה עבור התור לעיבוד. זה כולל גם את הנתונים העיקריים הדרושים לבניית האימייל. להבנה קלה, ה שלח אימייל() הפונקציה תהיה דומה לדוגמא הזו:

// emailHandler.js
const sendgridMail = לִדרוֹשׁ('@sendgrid/mail');

const apiKey = process.env. SENDGRID_API_KEY

sendgridMail.setApiKey (apiKey); // הגדר אישורי אבטחה של מעביר דוא"ל

const sendEmail = אסינכרון (emailJob) => {
לְנַסוֹת {
// לחלץ את נתוני האימייל מהעבודה
const { name, email } = emailJob.data;

const הודעה = {
מ: '[email protected]',
ל: '[email protected]',
נושא: 'היי! ברוך הבא',
טֶקסט: `שלום ${name}, ברוכים הבאים ל-MUO`
};

לְהַמתִין sendgridMail.sendMail (הודעה); // שלח אימייל

// סמן את המשימה כמושלמה בתור
לְהַמתִין emailJob.moveToCompleted('בוצע', נָכוֹן);
לְנַחֵם.עֵץ('אימייל נשלח בהצלחה...');
} לתפוס (שגיאה) {
// העבר את המשימה לעבודות שנכשלו
לְהַמתִין emailJob.moveToFailed({ הוֹדָעָה: 'עיבוד המשימות נכשל..' });
לְנַחֵם.error (שגיאה); // תימן את השגיאה
}
}

יְצוּאבְּרִירַת מֶחדָל שלח אימייל;

כעת, לאחר שהפונקציות של היצרן והצרכן מוגדרות ומוכנות לשימוש, כעת תוכל להתקשר לפונקציית היצרן שלך בכל מקום ביישום שלך כדי להוסיף אימייל לתור לעיבוד.

בקר לדוגמה ייראה כך:

// userController.js
const EmailQueue = לִדרוֹשׁ('../handlers/queueHandler.js')

const הרשמה = אסינכרון (req, res) => {
const { name, email, password } = req.body;

// --
// שאילתה להוספת המשתמש החדש למסד הנתונים...
// --

// הוסף לתור הדוא"ל
const emailData = { name, email };
לְהַמתִין EmailQueue.addEmailToQueue (emailData);

res.status(200).json({
הוֹדָעָה: "ההרשמה הצליחה, אנא בדוק את האימייל שלך"
})
}

שֶׁלְךָ queueHandler.js הקובץ אמור כעת להיות כדלקמן:

// queueHandler.js
const תור = לִדרוֹשׁ('שׁוֹר');
const emailHandler = לִדרוֹשׁ('../handlers/emailHandler.js');

const REDIS_URL = 'redis://127.0.0.1:6379';

const queueOpts = {
מגביל: {
מקסימום: 100,
מֶשֶׁך: 10000
},

קידומת: 'EMAIL-TASK',

defaultJobOptions: {
ניסיונות: 3,
removeOnComplete: נָכוֹן
}
};

מעמדתור דוא"ל{
בַּנַאִי() {
זֶה.queue = חָדָשׁ תוֹר('תור דואר אלקטרוני', REDIS_URL, queueOpts);

// צרכן
זֶה.queue.process('email_notification', אסינכרון (emailJob, done) => {
לְנַחֵם.עֵץ('משימת עיבוד הודעת דוא"ל');
לְהַמתִין emailHandler.sendEmail (emailJob);
בוצע();
})
}

// מפיק
אסינכרון addEmailToQueue (emailData) {
// הוסף משימה בשם 'email_notification' לתור
לְהַמתִיןזֶה.queue.add('email_notification', emailData);
לְנַחֵם.עֵץ('המייל התווסף לתור...');
}
};

יְצוּאבְּרִירַת מֶחדָל EmailQueue;

כאשר אתה מיישם זאת ב-Node.js REST API, אתה תבחין בירידה בזמן התגובה של נקודת הקצה של ההרשמה, וזמני אספקת דוא"ל מהירים יותר, בהשוואה לחלופה.

תורי משימות גם אפשרו לך לטפל בשגיאות הרשמה ושגיאות דוא"ל באופן עצמאי.

אופטימיזציה של יישומים באמצעות תורי משימות

תורי הודעות ומשימות הם דרך מצוינת לשפר את הביצועים הכלליים של יישומים. הם גם זולים מאוד ואתה יכול להשתמש בהם בכמה חלקים של יישום שאתה צריך.

למרות שמדריך זה השתמש במיילים כתרחיש לדוגמה לטיפול במשימות גוזלות זיכרון עם תורים, ישנם מקרים רבים אחרים שבהם אתה יכול ליישם את אותם מושגים. אלה כוללים פעולות קריאה/כתיבה כבדות, עיבוד תמונות או מסמכים באיכות גבוהה ושליחת הודעות בתפזורת.