Ví dụ về hàng đợi tăng giá của NodeJS

Hàng đợi là một cấu trúc tuyến tính tuân theo một thứ tự cụ thể trong đó các thao tác được thực hiện. Thứ tự là First In First Out (FIFO). Một ví dụ điển hình về hàng đợi là bất kỳ hàng đợi nào của người tiêu dùng cho một tài nguyên mà người tiêu dùng đến trước được phục vụ trước–  GeekforGeek

Trước đây, tôi đã chơi với Kue nhưng gói đã không được cập nhật trong khoảng 4 năm và hiện tại họ khuyên bạn nên làm như vậy .

Khi xây dựng API, mục tiêu luôn là trả về phản hồi trong thời gian nhanh nhất có thể. Nhưng có những lúc chúng tôi muốn chạy một số công việc dựa trên thông tin chúng tôi có trong logic mã của chúng tôi sau này. Đây là nơi Bull đến

Bull là hàng đợi công việc ưu tiên giàu tính năng dành cho Node. js được hỗ trợ bởi Redis. Nó cho phép chúng tôi ủy quyền quy trình/công việc đó cho Redis để chạy trong nền trong khi trả về phản hồi ngay lập tức. Bull tuân theo định dạng Nhập trước xuất trước, nhưng chúng ta có thể đặt mức độ ưu tiên cho các công việc của mình trong cấu hình và công việc có mức độ ưu tiên cao hơn sẽ được ưu tiên hơn công việc có mức độ ưu tiên thấp hơn

Tổng quan ngắn gọn về những gì chúng ta sẽ xây dựng

Trong bài viết này, chúng ta sẽ xây dựng một API đăng ký người dùng và gửi cho họ email cùng với tin nhắn văn bản khi đăng ký thành công. Chúng tôi sẽ sử dụng Công việc ưu tiên của Kue để gửi email và tin nhắn văn bản Chào mừng với sự trợ giúp của Sendgrid và API nhắn tin Twilio

điều kiện tiên quyết

  • nút js

  • Thể hiện

  • MongoDB

Thiết lập máy chủ của chúng tôi

Chúng tôi sẽ xây dựng bản trình diễn này bằng ExpressJs, một Nút tối thiểu và linh hoạt. js khung ứng dụng web cung cấp một bộ tính năng mạnh mẽ cho các ứng dụng web và di động. Điều quan trọng là phải cài đặt Node trên máy cục bộ của bạn. Để xác minh rằng bạn đã cài đặt nút, hãy mở thiết bị đầu cuối của bạn và chạy lệnh sau.

node --v

Nếu bạn chưa cài đặt Node, bạn có thể tải xuống tại đây

Tiếp theo, chúng tôi sẽ cần tạo một thư mục để chứa mã phía máy chủ của chúng tôi và chúng tôi có thể làm điều đó bằng cách chạy lệnh trong thiết bị đầu cuối bên dưới

mkdir 

Sau đó, chúng tôi c thay đổi thư mục thành thư mục mới của chúng tôi, mở nó trong trình chỉnh sửa mã của chúng tôi và chạy lệnh init để khởi tạo nút của chúng tôi . json cho chúng tôi.

npm init

Sau khi khởi tạo ứng dụng của chúng tôi và tạo gói của chúng tôi. json, chúng tôi sẽ cài đặt các gói sau để bắt đầu

npm i express redis bull mongoose dotenv twilio @sendgrid/mail mailgen

Sau khi cài đặt các phụ thuộc của chúng tôi, chúng tôi sẽ cần viết mã để khởi động máy chủ của chúng tôi trong chỉ mục của chúng tôi. js như bên dưới

require("dotenv").config();
const express = require("express");
const app = express();
const port = process.env.PORT || 4000;




app.listen(port, () => console.log(`App listening on port ${port}`));

Thiết lập cấu trúc tệp

Bây giờ, chúng ta sẽ thiết lập cấu trúc tệp cho mã của mình

Ví dụ về hàng đợi tăng giá của NodeJS

Để tính năng này hoạt động, bạn cần cài đặt cục bộ MongoDB và Redis. Bạn có thể tải xuống bản cài đặt cục bộ của MongoDB tại đây và của Redis tại đây. Ngoài ra, bạn có thể thiết lập một bậc MongoDB miễn phí trên tập bản đồ bằng liên kết này và sử dụng liên kết kết nối của họ

Chúng ta cũng sẽ thiết lập cấu hình cơ sở dữ liệu của mình, cấu hình này sẽ bao gồm các cấu hình dành cho kết nối với MongoDB, như bên dưới.

require("dotenv").config();
const mongoose = require("mongoose");

let mongoUrl = null;

const mongoConnection = () => {
    if (process.env.NODE_ENV === "test") {
        mongoUrl = process.env.TEST_DB;
    } else {
        mongoUrl = process.env.DATA_DB;
    }
    return mongoose.connect(mongoUrl, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        useFindAndModify: false,
    });
};

module.exports = mongoConnection;

Mã trong tệp ở trên chứa logic để kết nối với cơ sở dữ liệu MongoDB của chúng tôi

Tiếp theo, chúng tôi sẽ bổ sung lược đồ người dùng của mình như bên dưới

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema(
    {
        firstName: {
            type: String,
            required: [true, "User must have a first Name"],
            trim: true,
            lowercase: true,
        },
        lastName: {
            type: String,
            required: [true, "User must have a last Name"],
            trim: true,
            lowercase: true,
        },
        sex: {
            type: String,
            required: [true, "Sex is required"],
            trim: true,
            lowercase: true,
        },
        email: {
            type: String,
            unique: true,
            required: [true, "User must have an email"],
            trim: true,
            lowercase: true,
        },
        dateOfBirth: {
            type: Date,
            required: [true, "User must have a Date of Birth"],
        },
        phoneNumber: {
            type: String,
            required: [true, "User must have a Phone Number"],
        },
    },
    { timestamps: true }
);

module.exports = mongoose.model("User", userSchema);

Đăng ký người dùng và sử dụng Kue Priority Jobs để gửi email và tin nhắn chào mừng

Bây giờ, chúng tôi sẽ tiếp tục tạo tệp đăng ký trong bộ điều khiển của mình để xử lý logic tạo người dùng của chúng tôi. Chúng tôi cũng sẽ gửi email và tin nhắn văn bản cho người dùng của mình khi đăng ký trước khi trả lời phản hồi bằng Bull.

Để làm điều này, hãy làm theo các bước sau

  • Trước tiên, chúng tôi sẽ tạo một số chức năng trợ giúp để giúp chúng tôi gửi email và tin nhắn văn bản chào mừng tới những người dùng mới đăng ký của chúng tôi

Để gửi email chào mừng, bạn có thể tham khảo chức năng trợ giúp bên dưới

require("dotenv").config();
const Mailgen = require("mailgen");

const sgMail = require("@sendgrid/mail");

sgMail.setApiKey(process.env.SENDGRID_API_KEY);

function welcomeEmail(job, done) {
    const mailGenerator = new Mailgen({
        theme: "default",
        product: {
            name: "Aeeiee",
            link: `https://aeeiee.com`,
        },
    });
    const mail = {
        body: {
            name: `${job.firstName} ${job.lastName}`,
            intro: "Welcome to Aeeiee! We're very excited to have you on board.",
            action: {
                instructions: "To get started with Aeeiee, please click here:",
                button: {
                    color: "#22BC66",
                    text: "Checkout our Website",
                    link: `https://aeeiee.com`,
                },
            },
            outro:
                "Need help, or have questions? Just reply to this email, we'd love to help.",
        },
    };
    const emailBody = mailGenerator.generate(mail);

    const emailText = mailGenerator.generatePlaintext(mail);

    const mailOption = {
        to: job.email,
        from: `${process.env.SENDERS_EMAIL}`,
        subject: "Welcome to Aeeiee",
        html: emailBody,
        text: emailText,
    };
    done();
    return sgMail.send(mailOption);
}

module.exports = { welcomeEmail };

Tương tự như vậy, để gửi tin nhắn văn bản bằng cách sử dụng Twilio , bạn có thể sử dụng chức năng trợ giúp bên dưới. Nếu chưa thiết lập Twilio, bạn có thể theo liên kết này để tìm hiểu cách thiết lập Twilio và tạo thông tin xác thực API của mình.

________số 8

 

  • Tiếp theo, chúng ta sẽ tạo tệp cấu hình Bull để xử lý logic của Hàng đợi công việc của chúng ta.
const Queue = require("bull");

const queue = new Queue("Jobs");
const { welcomeEmail } = require("../helpers/welcomeEmail");
const { sendText } = require("../helpers/twilio");

const createJob = (options, data) => {
    const opts = { priority: 0, attempts: 5};
    queue.add(options, data, {
        attempts: opts.attempts,
        backoff: {
            type: "exponential",
            delay: 2000,
        },
        removeOnComplete: true,
        removeOnFail: true,
    });
};

queue.process("Welcome email", (job, done) => welcomeEmail(job.data, done));
queue.process("Send Text", (job, done) => sendText(job.data, done));

module.exports = { createJob };

Mã trên hiển thị một số cấu hình chúng tôi đang đặt cho phiên bản Bull của chúng tôi. Công việc của chúng tôi là sẽ cố gắng chạy lại 5 lần trong trường hợp thất bại. Chúng tôi cũng đang đặt công việc bị xóa khỏi hàng đợi khi hoàn thành hoặc thất bại. Và cuối cùng, chúng tôi có cài đặt dự phòng để giúp giới hạn tỷ lệ của bên thứ ba.

 

  • Sau đó, chúng tôi tạo bộ điều khiển đăng ký giúp chúng tôi đăng ký người dùng của mình
mkdir 
0

Sau đó, chúng tôi hiển thị bộ điều khiển này bằng cách tạo một tuyến đường hiển thị nó. Chúng tôi sẽ làm điều này bằng cách tạo một điểm cuối trong thư mục tuyến đường của chúng tôi như hình bên dưới

mkdir 
1

Điểm cuối đăng ký của chúng tôi sẽ có sẵn tại http. //máy chủ cục bộ. 4000/đăng ký. Bây giờ chúng ta có thể gọi điểm cuối của mình bằng Postman với dữ liệu cần thiết và nhận lại phản hồi như hình bên dưới

Ví dụ về hàng đợi tăng giá của NodeJS

Chúng tôi cũng sẽ nhận được email và tin nhắn văn bản như hình bên dưới, đây là bằng chứng cho thấy công việc của chúng tôi đang chạy

Ví dụ về hàng đợi tăng giá của NodeJS

Ví dụ về hàng đợi tăng giá của NodeJS

Đây là một ví dụ rất cơ bản về việc sử dụng Bull để tạo và lên lịch Công việc. Có nhiều tùy chọn hơn trong bull như Trình xử lý sự kiện, Bộ giới hạn tỷ lệ, Loại công việc, sử dụng biểu thức Cron, v.v. Truy cập tài liệu chính thức để biết thêm thông tin. Mã đầy đủ có thể được tìm thấy ở đây

Bull queue hoạt động như thế nào?

Hàng đợi trong Bull tạo ra một số sự kiện hữu ích trong nhiều trường hợp sử dụng . Các sự kiện có thể là cục bộ cho một phiên bản hàng đợi nhất định (một công nhân), ví dụ: nếu một công việc được hoàn thành trong một công nhân nhất định, một sự kiện cục bộ sẽ được phát ra chỉ cho phiên bản đó.

Tại sao lại sử dụng bull trong nodejs?

Bull là thư viện Node triển khai hệ thống hàng đợi nhanh và mạnh mẽ dựa trên Redis . Nó làm cho việc truy cập vào các chức năng cấp thấp của Redis khá đơn giản và trực quan với API của nó, điều này cũng làm phong phú chúng.

Đồng thời trong hàng đợi tăng giá là gì?

Yếu tố đồng thời là tùy chọn worker xác định số lượng công việc được phép xử lý song song . Điều này có nghĩa là cùng một công nhân có thể xử lý một số công việc song song, tuy nhiên hàng đợi đảm bảo như "ít nhất một lần" và thứ tự xử lý vẫn được giữ nguyên.

Mô-đun bò là gì?

mô-đun bò đực. Bull là thư viện dùng để bán các sản phẩm kỹ thuật số trên trang web của bạn . Nó có nghĩa là chạy trên cùng một tên miền với trang bán hàng của bạn, giúp cho việc theo dõi phân tích trở nên dễ dàng.