Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

Для веб-разработчика крайне важно, чтобы ваши приложения работали как можно быстрее. Вы должны создавать веб-приложения, которые отвечают на запросы как можно быстрее.

Одна из многих технологий, которые могут вам помочь, — это организация очереди задач.

Итак, что такое очередь задач и как ее использовать для оптимизации приложения Node.js?

Что такое очередь задач?

Очередь сообщений — это средство асинхронной связи между двумя приложениями или службами, обычно называемое режиссер и потребитель. Это хорошо известная концепция, используемая в бессерверных и микросервисных архитектурах.

Концепция чего-либо задача или работаочередь использует очередь сообщений для повышения производительности приложений. Он абстрагирует сложности управления сообщениями и позволяет определять функции для асинхронного управления заданиями или задачами с использованием очереди, тем самым снижая скорость обработки сообщений.

instagram viewer
использование памяти в некоторых частях приложения.

Наиболее распространенным примером программного обеспечения очереди сообщений является 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 labs по установке Redis если он у вас не установлен.

Первый шаг к внедрению Bull — добавить его в зависимости вашего проекта, запустив npm установить бык или пряжа добавить бычок в терминале внутри папки вашего проекта. Существует несколько способов инициализации очереди в Bull, как показано ниже:

константа Очередь = требовать(бык);

// разные способы инициализации очереди
// - используя строку URL-адреса redis
константа электронная почтаОчередь = новый Очередь(«Очередь электронной почты», 'Редис://127.0.0.1:6379');

// - с Redis-соединением и объектом опций очереди
константа видеоОчередь = новый Очередь(«Очередь видео», 'Редис://127.0.0.1:6379', параметры очереди);

// - без подключения Redis, но с параметром очереди
константа очередь документов = новый Очередь(«Очередь документов», параметры очереди);

// - без Redis-соединения или опций очереди
константа QueueClient = новый Очередь(«Моя очередь»);

Все они используют минимальную конфигурацию Bull в Node.js. Объект параметров поддерживает множество свойств, и вы можете узнать о них в раздел параметров очереди документации Bull.

Реализация очереди задач электронной почты с использованием BullMQ

Чтобы реализовать очередь для отправки электронных писем, вы можете определить функцию-производитель, которая добавляет электронные письма в очередь электронной почты, и функцию-потребитель для обработки отправки электронных писем.

Во-первых, вы можете инициализировать свою очередь в классе, используя URL-адрес Redis и некоторые параметры очереди, как показано ниже.

// очередьHandler.js
константа Очередь = требовать(бык);

// здесь используйте настоящий модуль обработчика электронной почты — это всего лишь пример
константа электронная почтаHandler = требовать('./emailHandler.js');

// определяем константы, URL-адрес Redis и параметры очереди
константа REDIS_URL = 'Редис://127.0.0.1:6379';

константа очередьОптс = {
// параметры ограничения скорости, чтобы избежать перегрузки очереди
ограничитель: {
// максимальное количество задач, которое может принять очередь
Макс: 100,

// время ожидания в миллисекундах перед принятием новых заданий после
// достижение предела
продолжительность: 10000
},
префикс: 'ЭЛЕКТРОННАЯ ПОЧТА-ЗАДАЧА', // префикс, который будет добавлен ко всем ключам очереди
defaultJobOptions: { // параметры по умолчанию для задач в очереди
попытки: 3, // количество раз по умолчанию, чтобы повторить задачу

// удалить задачу из очереди после выполнения
удалить при завершении: истинный
}
};

сортЭлектронная почтаОчередь{
конструктор() {
этот.очередь = новый Очередь(«Очередь электронной почты», REDIS_URL, параметры очереди);
}
};

экспортпо умолчанию Электронная очередь; // экспортируем класс

Теперь, когда вы инициализировали очередь, вы можете определить функцию производителя (используя метод Bull's добавлять() функция) как метод Электронная почтаОчередь класс для добавления писем в очередь задач. Следующий блок кода демонстрирует это:

// очередьHandler.js

сортЭлектронная почтаОчередь{
конструктор () {
// ...
}

// функция производителя для добавления писем в очередь
асинхронный addEmailToQueue (emailData) {
// добавляем задачу с именем 'email_notification' в очередь
Ждитеэтот.очередь.добавить('Уведомление по электронной почте', электронная почта);
консоль.бревно('письмо добавлено в очередь...');
}
};

экспортпо умолчанию Электронная очередь; // экспортируем класс

Функция-производитель готова, и теперь вы можете определить функцию-потребитель (используя метод Булла). процесс() функция) для обработки всех задач электронной почты в очереди, т.е. вызвать функцию для отправки электронного письма. Вы должны определить эту потребительскую функцию в конструкторе класса.

// очередьHandler.js
сортЭлектронная почтаОчередь{
конструктор () {
// ...

// потребительская функция, которая принимает заданное имя задачи и
// функция обратного вызова
этот.очередь.процесс('Уведомление по электронной почте', асинхронный (emailJob, выполнено) => {
консоль.бревно('обработка задачи уведомления по электронной почте');
Ждите emailHandler.sendEmail(emailJob); // отправить электронное письмо
сделанный(); // выполнить задачу
})
}
// ...
};

экспортпо умолчанию Электронная очередь; // экспортируем класс

У задания также могут быть параметры для определения его поведения в очереди или того, как его обрабатывает функция-потребитель. Подробнее об этом вы можете узнать в раздел вариантов работы в документации Bull.

электронная почтаРабота аргумент — это объект, содержащий свойства задачи для обработки очереди. Он также включает основные данные, необходимые для создания электронного письма.. Для простоты понимания, отправить по электронной почте () функция будет похожа на этот пример:

// emailHandler.js
константа sendgridMail = требовать('@sendgrid/почта');

константа APIKey = процесс.env. SENDGRID_API_KEY

sendgridMail.setApiKey(apiKey); // устанавливаем учетные данные безопасности транспортера электронной почты

константа отправить по электронной почте = асинхронный (emailJob) => {
пытаться {
// извлечь данные электронной почты из задания
константа {имя, электронная почта} = emailJob.data;

константа сообщение = {
от: '[email protected]',
к: 'вы@example.com',
предмет: 'Привет! Добро пожаловать',
текст: `Привет $ {имя}, добро пожаловать в МУО`
};

Ждите sendgridMail.sendMail (сообщение); // отправить письмо

// помечаем задачу как выполненную в очереди
Ждите emailJob.moveToCompleted('сделанный', истинный);
консоль.бревно('Письмо успешно отправлено...');
} ловить (ошибка) {
// перемещаем задачу в неудачные задания
Ждите emailJob.moveToFailed({ сообщение: 'обработка задачи не удалась..' });
консоль.error (ошибка); // регистрируем ошибку
}
}

экспортпо умолчанию отправить по электронной почте;

Теперь, когда у вас определены и готовы к использованию функции производителя и потребителя, теперь вы можете вызывать функцию производителя в любом месте вашего приложения, чтобы добавить электронное письмо в очередь для обработки.

Пример контроллера будет выглядеть так:

// userController.js
константа EmailQueue = требовать('../обработчики/queueHandler.js')

константа зарегистрироваться = асинхронный (требование, разрешение) => {
константа {имя, адрес электронной почты, пароль} = req.body;

// --
// запрос на добавление нового пользователя в базу данных...
// --

// добавить в очередь электронной почты
константа emailData = {имя, электронная почта};
Ждите EmailQueue.addEmailToQueue (данные электронной почты);

рез.статус(200).json({
сообщение: "Регистрация прошла успешно, пожалуйста, проверьте почту"
})
}

Твой очередьHandler.js теперь файл должен быть следующим:

// очередьHandler.js
константа Очередь = требовать(бык);
константа электронная почтаHandler = требовать('../handlers/emailHandler.js');

константа REDIS_URL = 'Редис://127.0.0.1:6379';

константа очередьОптс = {
ограничитель: {
Макс: 100,
продолжительность: 10000
},

префикс: 'ЭЛЕКТРОННАЯ ПОЧТА-ЗАДАЧА',

defaultJobOptions: {
попытки: 3,
удалить при завершении: истинный
}
};

сортЭлектронная почтаОчередь{
конструктор() {
этот.очередь = новый Очередь(«Очередь электронной почты», REDIS_URL, параметры очереди);

// потребитель
этот.очередь.процесс('Уведомление по электронной почте', асинхронный (emailJob, выполнено) => {
консоль.бревно('обработка задачи уведомления по электронной почте');
Ждите emailHandler.sendEmail(emailJob);
сделанный();
})
}

// режиссер
асинхронный addEmailToQueue (emailData) {
// добавляем задачу с именем 'email_notification' в очередь
Ждитеэтот.очередь.добавить('Уведомление по электронной почте', электронная почта);
консоль.бревно('письмо добавлено в очередь...');
}
};

экспортпо умолчанию Электронная очередь;

Когда вы реализуете это в REST API Node.js, вы заметите уменьшение времени отклика конечной точки регистрации и более быструю доставку электронной почты по сравнению с альтернативой.

Очереди задач также позволяют независимо обрабатывать ошибки регистрации и электронной почты.

Оптимизация приложений с использованием очередей задач

Очереди сообщений и задач — отличный способ повысить общую производительность приложений. Они также очень дешевы, и вы можете использовать их в любом количестве частей приложения.

Хотя в этом учебнике в качестве примера сценария обработки ресурсоемких задач с очередями использовались электронные письма, существует множество других случаев, когда вы можете применить те же концепции. К ним относятся тяжелые операции чтения/записи, рендеринг высококачественных изображений или документов и массовая рассылка уведомлений.