Что делает планировщик заданий?

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

Давайте углубимся в этот сценарий, чтобы лучше понять «Зачем нам нужны планировщики заданий в нашем приложении?»

Допустим, я зарегистрировался на сайте, где после успешной регистрации будет отправлено одно приветственное письмо. Теперь предположим, что время, затраченное на регистрацию, составляет 1 секунду, а на отправку электронной почты - 2 секунды. Таким образом, общее количество времени, которое конечный пользователь должен ждать, составляет 3 секунды. А теперь подумайте: есть ли необходимость заставлять конечного пользователя ждать еще 2 секунды? Даже если их регистрация уже прошла за 1 секунду? НЕТ.

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

Реализация в приложении Node JS

Существуют определенные библиотеки, такие как Kue, Bull, BullMQ и т. Д. который мы можем использовать для реализации планирования заданий в нашем приложении. Давайте сначала обсудим рабочий процесс Bull.

Бык

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

В Bull у нас в основном два компонента для управления всем рабочим процессом: Производители и Потребители. Производители в основном несут ответственность за Создание задания и добавление их в Redis Queue. Хотя потребители несут ответственность за обработку задания из очереди, мы также можем называть их работниками.

Создание очереди

Чтобы создать очередь, нам нужно импортировать класс Queue из Bull, а затем передать объект конфигурации redis-server в экземпляр Queue. После этого наша очередь будет создана. В приведенном ниже примере кода «sendMail» - это имя очереди. Вы можете выбрать все, что подходит для вашего типа работы.

const Queue = require('bull');
const sendMail = require('../utils/sendMail');
/** Initializing the Queue */
const sendMailQueue = new Queue('sendMail', {
   redis: {
      host: process.env.LOCAL_HOST,  // 127.0.0.1
      port: process.env.REDIS_PORT,  // 6379
   },
});

Создание вакансии (продюсер)

Теперь наша очередь готова, мы можем добавлять в нее задания. Чтобы создать задание, мы должны передать объект data и объект options (что необязательно). Обычно объект параметров содержит две клавиши: задержка и попытки, задержка указывает количество времени (в миллисекундах). для задержки определенного задания, а попытки относятся к количеству повторных попыток, если задание не удалось получить с первой попытки.

const data = {
  to: payload.email,
  subject: '🌍 Warm welcome from Company',
  body: 'This is welcome email.',
};
const options = {delay: 5000, attempts: 3}; // 5 sec. in millisecond
/** Adding a Job to the Queue */
sendMailQueue.add(data, options);

Теперь мы добавим это задание в очередь, используя метод .add Bull.

Обработка вакансии (потребитель / работник)

Чтобы обработать или разрешить добавленное задание очереди, нам нужно вызвать метод .process Bull. Внутри функции обратного вызова .process мы можем получить ключи данных, написав jobs.data. ‹Key-name›. В нашем примере кода мы вызываем служебный файл sendMail (который будет отвечать за отправку электронных писем) и передаем в него весь объект данных.

/** Consumer */
sendMailQueue.process(async (job) => await sendMail(job.data));

Репозиторий Github. Удачного кодирования! 🖥