Обложка фото Бимо Луки на Неспособный
Как вы видели в предыдущей статье, очереди задач довольно удивительны 🌟, и в этом уроке мы будем использовать очередь задач в нашем собственном приложении, давайте испастят руки и напишут какой -нибудь код.
Мы будем строить наш ресторан, как объяснено в предыдущей статье.
Этот учебник был бы большой демонстрацией, а не рабочим приложением, так что придерживайтесь меня, если вы хотите проверить, как подключить очередь задач в ваше приложение. В следующей статье мы будем создавать реальное приложение. (Я знаю, что это захватывающе, и вы не можете дождаться этого 😉).
👨💻 Ссылка на весь репо всего Github для этого проекта находится в конце статьи ⬇
Давайте начнем.
До- реквизиты
- Установить Node.js На своей машине, а затем запустите следующую команду, чтобы проверить правильную установку.
$ node --version > v12.16.1
- Redis работает на вашем компьютере или в облаке. Установить Redis или создать экземпляр на Redislabs бесплатно.
И мы готовы идти 😁
Инициализация
Бежать:
$ npm init
После этого установите необходимые пакеты, работая
$ npm install express bee-queue dotenv
Если вам интересно, что делает каждый пакет, вот некоторая информация:
ЭкспрессПомогает нам легко создать сервер и легко обрабатывать входящие запросы.Bee-QueueНаш менеджер очередей за заданиями и поможет создавать и запустить заданияdotenvПомогает нам загрузить переменные среды с локального.envфайл
После этого создайте файл restaurant.js и отредактируйте свой package.json так что это выглядит примерно так
{
...
"main": "restaurant.js",
"scripts": {
"start": "node restaurant.js"
}
...
}
Время для настоящего кода
Open restaurant.js В редакторе по вашему выбору и добавьте следующие строки кода
require('dotenv').config();
const express = require('express');
const http = require('http');
// Inits
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// Routes
app.get('/', (req, res) => {
res.send("😋 We are serving freshly cooked food 🍲");
});
// Create and start the server
const server = http.createServer(app);
const PORT = process.env.PORT || 5000;
server.listen(PORT, () => {
console.log(`Restaurant open at:${PORT}`);
});
В основном он запускает локальный веб -сервер в указанном порту (здесь, 5000) и прослушивает входящий Получить Запросы на базовый URL / и отвечает текстом.
Запустите следующую команду, чтобы запустить сервер и перейти к Localhost: 5000 в вашем браузере.
$ npm start > restaurant@1.0.0 start /mnt/code/dev/queue > node restaurant.js Restaurant open at port:5000
Вы получите пустую страницу с аккуратной маленькой 😋 Мы подаем свежую приготовленную еду 🍲 сообщение
Теперь пришло время создать нашу очередь задач
Сначала создайте файл с именем .env и вставьте в него свои учетные данные базы данных, например, (вы также можете использовать свой местный экземпляр REDIS здесь) и помните, никогда не совершать .env к вашему источнику управления.
DB_HOST=redis-random-cloud.redislabs.com DB_PORT=14827 DB_PASS=pTAl.not-my-password.rUlJq
И вы закончили с базовой конфигурацией.
Давайте продолжим и создадим наше Официант Анкет Начните с создания файла официант.js и добавьте следующий кусок кода:
const Queue = require('bee-queue');
const options = {
removeOnSuccess: true,
redis: {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
password: process.env.DB_PASS,
},
}
const cookQueue = new Queue('cook', options);
const serveQueue = new Queue('serve', options);
const placeOrder = (order) => {
return cookQueue.createJob(order).save();
};
serveQueue.process((job, done) => {
console.log(`🧾 ${job.data.qty}x ${job.data.dish} ready to be served 😋`);
// Notify the client via push notification, web socket or email etc.
done();
})
// Notify the client via push notification, web socket or email etc.
done();
})
module.exports.placeOrder = placeOrder;
🤯 Вау! что это было? Ну, позвольте мне объяснить.
Сначала мы импортируем Bee-Queue пакет как Очередь , а затем передайте конфигурацию базы данных в наши два новых Очередь объекты. В одной из очередей будет список заказов, которые будут подготовлены поваром, а другой будет иметь список заказов, которые готовы к обслуживанию официанта.
Затем мы создаем новую функцию ПЛОСКОРДА это берет в Заказ как параметр. Мы определим этот объект порядка позже, но имейте в виду, что у него такая структура
order = {
dish: "Pizza 🍕",
qty: 2,
orderNo: "kbv9euic"
}
ПЛОСКОРДА Функция принимает этот порядок и добавляет его в очередь, вызывая . CreateJob (порядок). () Метод на Cookqueue Объект очереди. Это действует как задача Издатель Анкет
и, наконец, процесс Метод на Служба Объект очереди выполняет функцию обработчика (Работа, сделано) = > {...} Каждый раз, когда заказ готов и готов к обслуживанию. Это действует как задача потребитель Анкет
Мы называем dode () Чтобы подтвердить очередь задач, выполненную задачу, чтобы она могла отправить следующую задачу для обработки из очереди. Мы просто называем dode () Чтобы указать, что задача была успешной, и позвонить выполнен (ERR) то есть с первым параметром (где err – это сообщение об ошибке), чтобы указать сбой задания. Вы также можете позвонить Готово (null, msg) Чтобы указать успех работы во втором параметре MSG Быть сообщением успеха.
И наш официант 👨💼 готов
Теперь пришло время для кухни с поварами 👨🍳 Создайте другой файл Kitchen.js и вставьте в него следующие строки кода:
const Queue = require('bee-queue');
const options = {
removeOnSuccess: true,
redis: {
host: process.env.DB_HOST,
port: process.env.DB_PORT,
password: process.env.DB_PASS,
},
}
const cookQueue = new Queue('cook', options);
const serveQueue = new Queue('serve', options);
cookQueue.process(3, (job, done) => {
setTimeout(() => console.log("Getting the ingredients ready 🥬 🧄 🧅 🍄"), 1000);
setTimeout(() => console.log(`🍳 Preparing ${job.data.dish}`), 1500);
setTimeout(() => {
console.log(`🧾 Order ${job.data.orderNo}: ${job.data.dish} ready`);
done();
}, job.data.qty * 5000);
});
cookQueue.on('succeeded', (job, result) => {
serveQueue.createJob(job.data).save();
});
😌 Ну, это выглядит знакомо.
Да, точно, но единственное изменение в том, что здесь наши повара потребление из Cookqueue и публикация к Servqueue Чтобы официанты приняли и отбывали заказы.
Здесь нужно отметить, что все, что опубликовано через createJob (order) доступен для космомера как job.data в Queue.process () Функция обработчика метода (Работа, сделано) = > {...} , и если вы посмотрите внимательно, в cookqueue.process (3, (задание, сделано) => {...}) слишком. Да, мы передаем номер, перед фактической функцией обработчика. Он известен как параллелизм (количество задач в очереди, которые можно обрабатывать одновременно). Здесь мы установили его на 3, потому что на нашей кухне есть 3 повара, которые могут работать вместе.
И мы используем cookqueue.on ('добиться успеха', (job, result) = > {...}) Метод для вызова функции обработчика всякий раз, когда задача успешна (то есть, когда вы называете end () в методе ()
Поверьте мне, мы почти закончили 🤞
Последний шаг: зацепите все вместе
Open restaurant.js и добавить эти последние строки кода
// ...
// Add these lines before the Inits.
require('./kitchen');
const { placeOrder } = require('./waiter');
// Inits
// ...
// Routes
// ...
app.post('/order', (req, res) => {
let order = {
dish: req.body.dish,
qty: req.body.qty,
orderNo: Date.now().toString(36)
}
if (order.dish && order.qty) {
placeOrder(order)
.then(() => res.json({ done: true, message: "Your order will be ready in a while" }))
.catch(() => res.json({ done: false, message: "Your order could not be placed" }));
} else {
res.status(422);
}
})
// Create and start the server
// ...
То, что мы сделали здесь, импортируется наше Кухня и Официант и добавил почтовый маршрут /заказ получать заказы от наших клиентов. Помните объект заказа?
order = {
dish: "Pizza 🍕",
qty: 2,
orderNo: "kbv9euic"
}
Мы создаем объект заказа из тела JSON по запросу POST и передаем его нашему официанту и отправляем ответ JSON, чтобы подтвердить нашего клиента. В случае, если запрос не сделан должным образом, мы также отправим некоторое сообщение об ошибке. И мы закончили ✌.
Да, правда, мы закончили. Теперь пришло время проверить это 😁
- Запустить сервер, запустив
$ npm startна вашем терминале. - Отправить запрос получить в
Localhost: 5000и посмотрите, получите ли вы такой ответ, как это: - Далее отправьте запрос сообщения в
Localhost: 5000/закази проверьте ответ и посмотрите на вашу консоль.
Вы можете отправить несколько запросов один за другим, чтобы проверить, что он не видит ни одного запроса.
Давайте добавим еще один ПОЧТА Маршрут, чтобы сравнить его с обычным рестораном без очереди задач.
Добавьте эти строки в restaurant.js :
// ...
app.post('/order-legacy', (req, res) => {
let order = {
dish: req.body.dish,
qty: req.body.qty,
orderNo: Date.now().toString(36)
}
if (order.dish && order.qty) {
setTimeout(() => console.log("Getting the ingredients ready... 🥬 🧄 🧅 🍄"), 1000);
setTimeout(() => console.log(`🍳 Preparing ${order.dish}`), 1500);
setTimeout(() => {
console.log(`🧾 Order ${order.orderNo}: ${order.dish} ready`);
res.json({ done: true, message: `Your ${order.qty}x ${order.dish} is ready` })
}, order.qty * 5000);
} else {
console.log("Incomplete order rejected");
res.status(422).json({ done: false, message: "Your order could not be placed" });
}
});
// Create and start the server
// ...
- Далее отправьте запрос сообщения в
Localhost: 5000/order-leagcyи проверьте ответ и посмотрите на вашу консоль.
Обратите внимание на разницу во времени отклика 🤯
С очередью задач
Без очереди задач
Вот github Repo, содержащий полный проект
Sarbikbetal/Nodejs-Task-Queue
Этот репо содержит пример кода для статьи “Simple Node.js Задача за задание с Bee-Queue и Redis”
Пожалуйста, прокомментируйте ниже, если у вас есть какие -либо вопросы или предложения, и не стесняйтесь обратиться к мне 😄, а также ознакомьтесь с разделом ниже для вопросов и ответов.
🤔 Хм.. У меня есть несколько вопросов, хотя.
Я знаю, так что вот некоторые общие, не стесняйтесь спрашивать больше в разделе комментариев ниже.
Как мы отправим еду на нашу клиенту после ее подготовки?
Для этого нам нужно реализовать некоторую дополнительную логику для нашего сервера и приложения на стороне клиента. Пример того, как мы можем достичь этого,-это веб-питания, отжимания, электронные письма и т. Д. Не волнуйтесь, хотя я расскажу об этом в подробности в следующей статье.
Разве нет лучших вещей, как Rabbitmq?
Да, конечно, есть, но для небольших проектов, которые не нуждаются в большом количестве передовых функций, но все же хотят поддерживать приличную защитную инфраструктуру Rabbitmq был бы излишним, а пчелиная Queue может оказаться простой и легкой в использовании.
Оригинал: “https://dev.to/sarbikbetal/simple-node-js-task-queue-with-bee-queue-and-redis-105b”