Като уеб разработчик е изключително важно вашите приложения да работят възможно най-бързо. Трябва да създавате уеб приложения, които отговарят на заявки възможно най-бързо.
Една от многото технологии, които могат да ви помогнат, е опашката със задачи.
И така, какво е опашка със задачи и как можете да го използвате, за да оптимизирате Node.js приложение?
Какво е опашка със задачи?
Опашката за съобщения е средство за асинхронна комуникация между две приложения или услуги, обикновено наричани продуцент и консуматор. Това е добре позната концепция, използвана в безсървърни и микросервизни архитектури.
Концепцията за задача или работаопашка използва опашка от съобщения, за да подобри производителността на приложението. Той абстрахира сложността на управлението на съобщения и ви позволява да дефинирате функции за управление на задания или задачи асинхронно с помощта на опашка, като по този начин намалявате скоростта на
използване на паметта в някои части на приложение.Най-често срещаният пример за софтуер за опашка от съобщения е RabbitMQ. Инструментите за опашка от задачи включват Celery и Bull. Можете също така да конфигурирате 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, както е показано по-долу:
конст Опашка = изискват(бик);
// различни начини за инициализиране на опашка
// - използвайки redis URL низ
конст emailQueue = нов Опашка(„Опашка за имейли“, 'redis://127.0.0.1:6379');// - с връзка redis и обект с опции за опашка
конст videoQueue = нов Опашка(„Опашка за видео“, 'redis://127.0.0.1:6379', queueOptions);// - без redis връзка, но с queueOption
конст docQueue = нов Опашка(„Опашка за документи“, queueOptions);
// - без redis връзка или опции за опашка
конст QueueClient = нов Опашка(„Моята опашка“);
Всички те използват минимална конфигурация за Bull в Node.js. Обектът с опции поддържа много свойства и можете да научите за тях в раздел с опции за опашка в документацията на Bull.
Внедряване на опашка със задачи за имейл с помощта на BullMQ
За да приложите опашка за изпращане на имейли, можете да дефинирате вашата функция за създаване, която добавя имейли към опашката за имейли, и потребителска функция, която да управлява изпращането на имейли.
Първо, можете да инициализирате вашата опашка в клас, като използвате Redis URL и някои опции за опашка, както се вижда по-долу.
// queueHandler.js
конст Опашка = изискват(бик);// използвайте истински модул за обработка на имейл тук - това е само пример
конст emailHandler = изискват('./emailHandler.js');// дефиниране на константи, Redis URL и опции за опашка
конст REDIS_URL = 'redis://127.0.0.1:6379';конст queueOpts = {
// опции за ограничаване на скоростта, за да се избегне претоварване на опашката
ограничител: {
// максимален брой задачи, които опашката може да поеме
макс.: 100,// време за изчакване в милисекунди преди приемане на нови задачи след това
// достигане на лимит
продължителност: 10000
},
префикс: „EMAIL-TASK“, // префикс, който да се добави към всички ключове на опашка
defaultJobOptions: { // опции по подразбиране за задачи в опашката
опити: 3, // брой пъти по подразбиране за повторен опит за задача// за премахване на задача от опашката след завършване
removeOnComplete: вярно
}
};класEmailQueue{
конструктор() {
това.queue = нов Опашка(„Опашка за имейли“, REDIS_URL, queueOpts);
}
};
износпо подразбиране EmailQueue; // експортиране на класа
Сега, след като сте инициализирали опашка, можете да дефинирате вашата функция на производителя (използвайки Bull's добави () функция) като метод на EmailQueue клас за добавяне на имейли към опашката със задачи. Следният кодов блок демонстрира това:
// queueHandler.js
класEmailQueue{
конструктор () {
// ...
}// функция на производителя за добавяне на имейли към опашката
асинхронен addEmailToQueue (emailData) {
// добавяне на задача с име 'email_notification' към опашката
изчакайтетова.queue.add('email_notification', emailData);
конзола.log(„имейлът е добавен към опашката...“);
}
};
износпо подразбиране EmailQueue; // експортиране на класа
Функцията на производителя е готова и сега можете да дефинирате потребителска функция (използвайки Bull's процес() функция), за да обработите всички имейл задачи в опашката – т.е. извикайте функцията за изпращане на имейл. Трябва да дефинирате тази потребителска функция в конструктора на класа.
// queueHandler.js
класEmailQueue{
конструктор () {
// ...// потребителска функция, която приема присвоеното име на задачата и
// функция за обратно извикване
това.queue.process('email_notification', асинхронен (emailJob, готово) => {
конзола.log(„обработване на задача за известяване по имейл“);
изчакайте emailHandler.sendEmail (emailJob); // изпрати имейла
Свършен(); // изпълнете задачата
})
}
// ...
};
износпо подразбиране EmailQueue; // експортиране на класа
Дадено задание може също да има опции за определяне на поведението му в опашката или как потребителската функция го обработва. Можете да научите повече за това в раздел с опции за работа в документацията на Bull.
The emailJob аргумент е обект, който съдържа свойствата на задачата за обработка от опашката. Той също така включва основните данни, необходими за съставяне на имейла. За по-лесно разбиране, Изпратете имейл() функция ще бъде подобна на този пример:
// emailHandler.js
конст sendgridMail = изискват(„@sendgrid/поща“);конст apiKey = process.env. SENDGRID_API_KEY
sendgridMail.setApiKey (apiKey); // задаване на идентификационни данни за защита на имейл транспортера
конст изпрати имейл = асинхронен (emailJob) => {
опитвам {
// извлечете имейл данните от заданието
конст { име, имейл } = emailJob.data;конст съобщение = {
от: '[email protected]',
да се: '[email protected]',
предмет: „Здрасти! Добре дошли',
текст: `Здравей ${име}, добре дошъл в MUO`
};изчакайте sendgridMail.sendMail (съобщение); // Изпратете имейл
// маркиране на задача като завършена в опашката
изчакайте emailJob.moveToCompleted('Свършен', вярно);
конзола.log(„Имейлът е изпратен успешно...“);
} улов (грешка) {
// преместете задачата в неуспешни задачи
изчакайте emailJob.moveToFailed({ съобщение: 'неуспешна обработка на задачата..' });
конзола.error (грешка); // регистрирайте грешката
}
}
износпо подразбиране Изпратете имейл;
Сега, след като имате дефинирани и готови за използване както функциите на производителя, така и на потребителя, вече можете да извикате функцията на производителя навсякъде във вашето приложение, за да добавите имейл към опашката за обработка.
Примерен контролер ще изглежда така:
// userController.js
конст EmailQueue = изискват('../handlers/queueHandler.js')конст регистрация = асинхронен (req, res) => {
конст { име, имейл, парола } = req.body;// --
// заявка за добавяне на новия потребител към базата данни...
// --// добавяне към опашката за имейл
конст emailData = { име, имейл };
изчакайте 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
},префикс: „EMAIL-TASK“,
defaultJobOptions: {
опити: 3,
removeOnComplete: вярно
}
};класEmailQueue{
конструктор() {
това.queue = нов Опашка(„Опашка за имейли“, REDIS_URL, queueOpts);// консуматор
това.queue.process('email_notification', асинхронен (emailJob, готово) => {
конзола.log(„обработване на задача за известяване по имейл“);
изчакайте emailHandler.sendEmail (emailJob);
Свършен();
})
}// продуцент
асинхронен addEmailToQueue (emailData) {
// добавяне на задача с име 'email_notification' към опашката
изчакайтетова.queue.add('email_notification', emailData);
конзола.log(„имейлът е добавен към опашката...“);
}
};
износпо подразбиране EmailQueue;
Когато внедрите това в Node.js REST API, ще забележите намаляване на времето за реакция на крайната точка за регистрация и по-бързи времена за доставка на имейл в сравнение с алтернативата.
Опашките със задачи също ви позволяват да обработвате независимо грешки при регистрация и имейл.
Оптимизиране на приложения с помощта на опашки със задачи
Опашките със съобщения и задачи са чудесен начин за подобряване на общата производителност на приложенията. Освен това са много евтини и можете да ги използвате в толкова части на приложението, колкото ви е необходимо.
Въпреки че този урок използва имейли като примерен сценарий за обработка на задачи, които отнемат памет с опашки, има много други случаи, в които можете да приложите същите концепции. Те включват тежки операции за четене/запис, изобразяване на висококачествени изображения или документи и изпращане на групови известия.