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

Существует множество систем очередей: Amazon Simple Queue Service (SQS), Apache Kafka, Kue, RabbitMQ, Sidekiq, Bull и т. Д. Каждая из них отличается и была создана для решения определенных проблем.

В этом руководстве мы создадим счетчик обращений API, чтобы подсчитывать, сколько раз пользователи обращались к определенному URL. Кроме того, мы рассмотрим, как создать очередь, поместить в нее задание и обработать его.

Мы собираемся использовать пакет очереди сообщений Bull на основе Redis для обработки заданий и сообщений в Node. Чтобы сохранить общее количество обращений к URL, мы будем использовать MongoDB.

Настройка проекта

Если вы просто хотите поскорее погрузиться в код, вот репо проекта.

Давайте инициализируем проект и установим все необходимые пакеты.

yarn init -y

Вот несколько пакетов, которые нам понадобятся для нашего проекта:

  • Bull: очередь на основе Redis для Node
  • dotenv-safe: считывание переменных среды из .env файла.
  • esm: поддерживает импорт / экспорт модулей узла.
  • ioredis: для подключения к Redis.
yarn add bull, dotenv-safe, esm, express, ioredis, mongoose

А для автоформатирования кода и автоматического перезапуска веб-сервера Express.js в разработке мы будем использовать Prettier, ESLint и nodemon.

yarn add -D eslint eslint-config-prettier eslint-plugin-prettier prettier

Настройка Экспресс

Давайте настроим простой веб-сервер Express, добавив приведенный ниже фрагмент кода в server.js по этому пути: ./src/server.js.

Если вы посмотрите на первую строку server.js кода, при добавлении модуля мы используем import вместо require . Поскольку мы уже добавили модуль esm для поддержки этого поведения на Node, для запуска этого простого веб-сервера нам просто нужно добавить приведенный ниже код в раздел scripts нашего package.json файла:

"start": "nodemon -r dotenv-safe/config -r esm ./src/server.js"

Вот и все - теперь, если мы запустим yarn start на нашем терминале, веб-сервер готов обслуживать наши запросы.

Настроить MongoDB

Далее мы будем использовать Docker Compose вместо того, чтобы устанавливать Redis и MongoDB вручную - хотя это зависит от вас. Если вы уже установили их на своем локальном компьютере, ничего страшного. Создадим docker-compose.yml файл в корне проекта:

И определите модель схемы MongoDB для сохранения общего количества обращений к API по этому пути: ./src/models/hitApi.model.js.

Теперь давайте подключимся к MongoDB с помощью Mongoose, указав mongoose.js по этому пути: ./src/mongoose.js. Кроме того, добавьте hitApi.model.js в файл, который мы определили ранее, чтобы мы могли иметь доступ к этой модели отовсюду:

Прежде чем мы вызовем функцию connectToMongo для подключения к MongoDB, мы должны убедиться, что MongoDB запущена, поэтому мы добавим следующую строку в раздел scripts файла package.json для запуска наших контейнеров Docker:

"docker:dev": "docker-compose -f docker-compose.yml up"

Запустив команду yarn docker:dev на другом терминале, наши контейнеры будут работать.

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

connectToMongo();

Большой! Пока мы настроили проект, запустили контейнеры и подключили веб-сервер к MongoDB. Последний шаг - создать нашу работу и запустить ее.

Создать вакансию

Очередь сообщений Bull использует Redis для сохранения и получения заданий, поэтому сначала нам нужно создать соединение с Redis и передать это соединение экземпляру Bull.

Создайте redisConnection.js и добавьте к нему следующий фрагмент кода по этому пути: ./src/lib/redisConnection.js.

Теперь мы можем использовать это соединение Redis в наших заданиях - например, давайте определим задание для обработки текущего URL-адреса и сохранения результата в MongoDB. Для этого создайте hitApi.redisJob.js по этому пути: ./src/jobs/hitApi.redisJob.js.

И что касается последней части, давайте добавим это задание в качестве промежуточного программного обеспечения перед маршрутами Express в файле server.js. Таким образом, когда пользователь нажимает URL-адрес, это задание будет запущено и обновит общее количество определенных URL-адресов под капотом.

...
const app = express();
connectToMongo();
app.get('/', (req, res) => {
res.send('hello world');
});
app.use(hitApi);
app.get('/api-1', (req, res) => {
res.send('you hit api-1');
});
app.get('/api-2', (req, res) => {
res.send('you hit api-2');
});
...

Примечание. Не забудьте создать .env файл в корне проекта, чтобы определить URL подключения MongoDB и Redis, а также пользователя / пароль, как показано ниже:

Начать работу

Откройте http://localhost:3000/api-1 или http://localhost:3000/api-2 URL-адрес в своем любимом браузере, и при проверке своей базы данных вы увидите, что каждый раз, когда вы открываете эти URL-адреса, общее количество этих URL-адресов будет обновляться.

Вот и все. Надеюсь, этот краткий обзор поможет вам начать работу с Bull в Node. Спасибо за чтение!

Вот ссылка на полный репозиторий на GitHub.