단순 노드.bee 대기열과 redis가 있는 js 작업 대기열

표지 사진은 Bimo Luki 에서 Unsplash
보시다시피 작업 대기열은 매우 훌륭합니다🌟 이 강좌에서, 우리는 자신의 응용 프로그램에서 작업 대기열을 사용하고, 코드를 작성하는 데 착수할 것이다.
우리는 이전 문장의 해석에 따라 우리의 식당을 건설할 것이다.
이 강좌는 작업 프로그램이 아니라 어느 정도 시범입니다. 따라서 작업 대기열을 응용 프로그램에 삽입하는 방법을 알고 싶으면 제 의견을 견지하십시오.
다음 글에서, 우리는 진정한 응용 프로그램을 구축할 것이다.(나는 이것이 매우 자극적이라는 것을 안다. 너는 기다릴 수 없다😉).
👨‍💻 본고의 말미에 이 프로젝트의 전체github 환매 링크를 제공하였다⬇

시작합시다.


예비 지식

  • 기계에 설치Node.js하고 다음 명령을 실행하여 설치가 정확한지 확인합니다.
  • $ node --version
    > v12.16.1
    
  • Redis는 당신의 컴퓨터나 클라우드에서 실행됩니다.무료 설치Redis 또는 RedisLabs에 실례를 만듭니다.
  • 우리 이제 가도 돼요.😁

    초기화


    실행:
    $ 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
    // ...
    
    저희가 여기서 하는 일은 저희kitchenwaiter를 도입하고 고객의 주문을 받기 위해 우편 노선/order을 추가하는 것입니다.주문 대상 기억나세요?
    order = {
        dish: "Pizza 🍕", 
        qty: 2,
        orderNo: "kbv9euic"
    }
    
    우리는 POST가 요청한 JSON 주체에서order 대상을 만들고 이를 종업원에게 전달한 다음에 JSON 응답을 보내서 우리의 고객을 확인합니다.만약 요청이 정확하지 않다면, 우리도 약간의 오류 메시지를 보낼 것이다.우리 끝났어.✌ .
    네, 정말이에요. 우리는 끝났어요.이제 테스트를 해볼 때가 됐어요.😁
  • 터미널 실행 $ npm start 서버를 시작합니다.
  • localhost:5000 에 get 요청을 보내서 다음 응답을 받았는지 확인합니다.

  • 다음으로 POST 요청을 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
    // ...
    
  • 다음으로 POST 요청을 localhost:5000/order-legacy 에 전송하여 응답을 확인하고 콘솔을 확인합니다.

  • 응답 시간 차이 주의🤯

    With the task queue

    Without task queue


    이것은 Github 환매 협의로 완전한 항목을 포함한다


    사비크 베타르 / nodejs 작업 대기열


    이 리포에는 "Simple Node.js task queue with bee queue and redis" 의 샘플 코드가 포함되어 있습니다.


    질문이나 건의가 있으시면 아래에 메시지를 남겨주시고 언제든지 연락 주십시오😄 아래의 문답 부분도 볼 수 있다.
    📸
    📨 Email
    👨‍💼
    👨‍💻 Github

    🤔 히드록시 메틸 멜라민 디메틸 에테르.근데 문제가 좀 있어서요.


    나는 여기에서 흔히 볼 수 있는 문제가 있다는 것을 알고 있으니, 아래의 평론 부분에서 더 많이 물어보세요.

  • 음식이 준비된 후에 우리는 어떻게 그것을 고객에게 발송합니까?


    이를 위해, 우리는 서버 측과 클라이언트 응용 프로그램을 위해 추가 논리를 실현해야 한다.우리는 WebSocket, 푸시 알림, 이메일 등을 통해 이 점을 실현할 수 있습니다. 걱정하지 마세요. 다음 글에서 상세하게 소개하겠습니다.

  • 혹시 Rabbit MQ 같은 더 좋은 건 없나요?


    네, 물론 있습니다. 하지만 많은 고급 기능이 필요하지 않지만 좋은 백엔드 인프라를 유지하기를 원하는 소규모 프로젝트에 대해rabbitMQ는 과도한 살상력이 될 것입니다. Beequeue는 간단하고 쉽게 사용할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기