단순 노드.bee 대기열과 redis가 있는 js 작업 대기열
30625 단어 nodewebdevtutorialjavascript
보시다시피 작업 대기열은 매우 훌륭합니다🌟 이 강좌에서, 우리는 자신의 응용 프로그램에서 작업 대기열을 사용하고, 코드를 작성하는 데 착수할 것이다.
우리는 이전 문장의 해석에 따라 우리의 식당을 건설할 것이다.
이 강좌는 작업 프로그램이 아니라 어느 정도 시범입니다. 따라서 작업 대기열을 응용 프로그램에 삽입하는 방법을 알고 싶으면 제 의견을 견지하십시오.
다음 글에서, 우리는 진정한 응용 프로그램을 구축할 것이다.(나는 이것이 매우 자극적이라는 것을 안다. 너는 기다릴 수 없다😉).
👨💻 본고의 말미에 이 프로젝트의 전체github 환매 링크를 제공하였다⬇
시작합시다.
예비 지식
$ node --version
> v12.16.1
초기화
실행:
$ npm init
이후 실행$ npm install express bee-queue dotenv
각 패키지의 기능을 알고 싶으면 다음 정보를 참조하십시오.express
서버를 쉽게 만들고 전송 요청을 처리하는 데 도움을 줍니다.bee-queue
작업 대기열 관리자로 작업 작성 및 실행에 도움을 줍니다dotenv
환경 변수를 로컬.env
파일그런 다음 파일
restaurant.js
을 만들고 편집package.json
하여 이렇게 보입니다.{
...
"main": "restaurant.js",
"scripts": {
"start": "node restaurant.js"
}
...
}
진짜 코드를 작성할 때가 됐어요.
선택한 편집기에서 열기
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 GET
의 전송 /
요청을 탐지하고 텍스트로 회답하는 것입니다.다음 명령을 실행하여 서버를 시작하고 브라우저의
localhost:5000
로 이동합니다.$ npm start
> [email protected] start /mnt/code/dev/queue
> node restaurant.js
Restaurant open at port:5000
너는 빈 페이지를 볼 수 있을 것이다. 그 위에 깔끔한 작은 소식이 있다😋 We are serving freshly cooked food 🍲
이제 저희 작업 대기열을 만들 때가 됐어요.
먼저
.env
라는 파일을 만들고 데이터베이스 증빙서류를 붙여넣습니다. (로컬 레디스 실례를 사용할 수도 있습니다.) 원본 코드 관리에 .env
를 제출하지 마십시오.DB_HOST=redis-random-cloud.redislabs.com
DB_PORT=14827
DB_PASS=pTAl.not-my-password.rUlJq
기본 구성이 완료되었습니다.우리
waiter
를 계속 만듭니다.먼저 파일waiter.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
패키지를 Queue
로 가져옵니다.그리고 데이터베이스 설정을 우리의 두 새
Queue
대상에 전달합니다.그 중 한 대열에는 요리사가 준비한 주문 목록이 있고, 다른 대열에는 종업원이 준비한 주문 목록이 있다.그리고 우리는 새로운 함수
placeOrder
를 만듭니다. 이 함수는 order
를 매개 변수로 받아들입니다.잠시 후에 우리는 이order 대상을 정의할 것이지만, 그 구조는 다음과 같다는 것을 기억하십시오order = {
dish: "Pizza 🍕",
qty: 2,
orderNo: "kbv9euic"
}
placeOrder
함수는 이 순서를 받아들이고 .createJob(order).save()
대기열 대상의 cookQueue
방법을 호출하여 대기열에 추가합니다.그것은 임무 발표자를 충당한다.마지막으로
process
대기열 대상의 serveQueue
방법은 주문서를 준비하고 서비스를 제공할 준비가 될 때마다 처리 함수(job, done) => {...}
를 실행한다.그것은 임무 사용자를 충당한다.작업 대기열에서 처리할 다음 작업을 보낼 수 있도록 작업 대기열의 작업이 완료되었는지 확인하기 위해
done()
를 호출합니다.우리는 임무의 성공을 표시하기 위해 done()
를 호출하고 done(err)
를 호출하기만 하면 된다. 즉, 첫 번째 매개 변수 (그중 err
는 오류 메시지) 를 사용하여 작업 실패를 표시한다.작업 성공을 표시하기 위해 done(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
소비에서 serveQueue
까지 종업원에게 주문을 받고 제공하도록 발표하고 있다는 거예요.여기서 주의해야 할 점은
createJob(order)
를 통해 발표된 모든 내용은 job.data
방법의 처리 함수Queue.process()
중의 (job, done) => {...}
로 소비자에게 제공할 수 있다는 점이다. 자세히 살펴보면 cookQueue.process(3, (job, done) => {...})
에서도 다른 점이 있다.네, 우리는 실제 처리 함수 전에 숫자를 전달합니다.이것은 병발성(대기열에서 동시에 처리할 수 있는 작업 수)이라고 불린다.여기에서 우리는 그것을 3으로 설정했다. 왜냐하면 우리 주방에는 세 명의 요리사가 있기 때문에 그들은 함께 일할 수 있기 때문이다.우리는
cookQueue.on('succeeded', (job, result) => {...})
방법을 사용하여 작업이 성공했을 때 처리 함수(즉, done()
방법에서 process()
를 호출합니다.나를 믿어라, 우리는 곧 끝난다🤞
마지막 단계: 모든 것을 한데 연결시키다
열기
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
// ...
저희가 여기서 하는 일은 저희kitchen
와waiter
를 도입하고 고객의 주문을 받기 위해 우편 노선/order
을 추가하는 것입니다.주문 대상 기억나세요?order = {
dish: "Pizza 🍕",
qty: 2,
orderNo: "kbv9euic"
}
우리는 POST가 요청한 JSON 주체에서order 대상을 만들고 이를 종업원에게 전달한 다음에 JSON 응답을 보내서 우리의 고객을 확인합니다.만약 요청이 정확하지 않다면, 우리도 약간의 오류 메시지를 보낼 것이다.우리 끝났어.✌ .네, 정말이에요. 우리는 끝났어요.이제 테스트를 해볼 때가 됐어요.😁
$ npm start
서버를 시작합니다.localhost:5000
에 get 요청을 보내서 다음 응답을 받았는지 확인합니다.localhost:5000/order
에 전송하여 응답을 확인하고 콘솔을 확인합니다.임무 대기열이 없는 일반 식당과 비교하기 위해 다른
POST
노선을 추가합시다.행 추가
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-legacy
에 전송하여 응답을 확인하고 콘솔을 확인합니다.이것은 Github 환매 협의로 완전한 항목을 포함한다
사비크 베타르 / nodejs 작업 대기열
이 리포에는 "Simple Node.js task queue with bee queue and redis" 의 샘플 코드가 포함되어 있습니다.
질문이나 건의가 있으시면 아래에 메시지를 남겨주시고 언제든지 연락 주십시오😄 아래의 문답 부분도 볼 수 있다.
📸
👨💼
👨💻 Github
🤔 히드록시 메틸 멜라민 디메틸 에테르.근데 문제가 좀 있어서요.
나는 여기에서 흔히 볼 수 있는 문제가 있다는 것을 알고 있으니, 아래의 평론 부분에서 더 많이 물어보세요.
음식이 준비된 후에 우리는 어떻게 그것을 고객에게 발송합니까?
이를 위해, 우리는 서버 측과 클라이언트 응용 프로그램을 위해 추가 논리를 실현해야 한다.우리는 WebSocket, 푸시 알림, 이메일 등을 통해 이 점을 실현할 수 있습니다. 걱정하지 마세요. 다음 글에서 상세하게 소개하겠습니다.
혹시 Rabbit MQ 같은 더 좋은 건 없나요?
네, 물론 있습니다. 하지만 많은 고급 기능이 필요하지 않지만 좋은 백엔드 인프라를 유지하기를 원하는 소규모 프로젝트에 대해rabbitMQ는 과도한 살상력이 될 것입니다. Beequeue는 간단하고 쉽게 사용할 수 있습니다.
Reference
이 문제에 관하여(단순 노드.bee 대기열과 redis가 있는 js 작업 대기열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sarbikbetal/simple-node-js-task-queue-with-bee-queue-and-redis-105b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)