Очередь - важный метод в 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. Спасибо за чтение!