/ / Xếp hàng nhiệm vụ một cách dễ dàng với Node.js và BullMQ

Xếp hàng nhiệm vụ một cách dễ dàng với Node.js và BullMQ

Là nhà phát triển web, điều quan trọng là ứng dụng của bạn phải hoạt động nhanh nhất có thể. Bạn nên xây dựng các ứng dụng web đáp ứng các yêu cầu trong thời gian nhanh nhất có thể.


Một trong nhiều công nghệ có thể giúp bạn là xếp hàng nhiệm vụ.

Vậy, hàng đợi tác vụ là gì và bạn có thể sử dụng nó như thế nào để tối ưu hóa ứng dụng Node.js?


Xếp hàng tác vụ là gì?

Hàng đợi tin nhắn là một phương tiện giao tiếp không đồng bộ giữa hai ứng dụng hoặc dịch vụ, thường được gọi là nhà sản xuấtngười tiêu dùng. Đó là một khái niệm nổi tiếng được sử dụng trong kiến ​​trúc serverless và microservice.

Khái niệm của nhiệm vụ hoặc công việc xếp hàng tận dụng hàng đợi tin nhắn để cải thiện hiệu suất ứng dụng. Nó trừu tượng hóa sự phức tạp của việc quản lý thông báo và cho phép bạn xác định các chức năng để quản lý công việc hoặc tác vụ không đồng bộ bằng cách sử dụng hàng đợi, do đó giảm tốc độ sử dụng bộ nhớ trong một số phần của ứng dụng.

Ví dụ phổ biến nhất về phần mềm xếp hàng tin nhắn là RabbitMQ. Các công cụ xếp hàng nhiệm vụ bao gồm Celery và Bull. Bạn cũng có thể định cấu hình RabbitMQ để hoạt động như một hàng đợi tác vụ. Đọc để tìm hiểu về hàng đợi tác vụ trong Node.js bằng Bull.

BullMQ là gì?

Logo BullMQ, hình bóng của một con bò đang chuẩn bị tấn công từ “BULL”

BullMQ (Bull.js) là một thư viện Node.js được sử dụng để triển khai hàng đợi trong các ứng dụng Node. Bull là một hệ thống dựa trên Redis (bạn có thể quen thuộc hơn với Redis như một công cụ để lưu trữ dữ liệu nhanh) và đây là một tùy chọn nhanh chóng và đáng tin cậy để xem xét cho hàng đợi tác vụ trong Node.js.

Bạn có thể sử dụng Bull cho nhiều nhiệm vụ như triển khai các công việc bị trì hoãn, công việc đã lên lịch, công việc lặp lại, hàng đợi ưu tiên, v.v.

Vì vậy, làm cách nào bạn có thể sử dụng Bull và Redis để chạy các tác vụ Node.js không đồng bộ?

Cách định cấu hình Bull và Redis cho hàng đợi tác vụ trong Node.js

Để bắt đầu xếp hàng tác vụ trong Node.js với Bull, bạn cần cài đặt Node.js và Redis trên máy của mình. Bạn có thể làm theo hướng dẫn phòng thí nghiệm Redis để cài đặt Redis nếu bạn chưa cài đặt.

Bước đầu tiên để triển khai Bull là thêm nó vào phần phụ thuộc của dự án bằng cách chạy cài đặt npm bò hoặc sợi thêm bò trong thiết bị đầu cuối bên trong thư mục dự án của bạn. Có nhiều cách để khởi tạo hàng đợi trong Bull như hình bên dưới:

 const Queue = require('bull');


const emailQueue = new Queue('Email Queue', 'redis://127.0.0.1:6379');


const videoQueue = new Queue('Video Queue', 'redis://127.0.0.1:6379', queueOptions);


const docQueue = new Queue('Document Queue', queueOptions);


const QueueClient = new Queue('My Queue');

Tất cả đều sử dụng cấu hình tối thiểu cho Bull trong Node.js. Đối tượng tùy chọn hỗ trợ nhiều thuộc tính và bạn có thể tìm hiểu về chúng trong phần tùy chọn hàng đợi trong tài liệu của Bull.

Triển khai hàng đợi tác vụ email bằng BullMQ

Để triển khai hàng đợi gửi email, bạn có thể xác định chức năng sản xuất của mình để thêm email vào hàng đợi email và chức năng người tiêu dùng để xử lý việc gửi email.

Đầu tiên, bạn có thể khởi tạo hàng đợi của mình trong một lớp bằng URL Redis và một số tùy chọn hàng đợi như bên dưới.

 
const Queue = require('bull');


const emailHandler = require('./emailHandler.js');


const REDIS_URL = 'redis://127.0.0.1:6379';

const queueOpts = {
    
    limiter: {
        
        max: 100,

        
        
        duration: 10000
    },
    prefix: 'EMAIL-TASK',
    defaultJobOptions: {
        attempts: 3,

        
        removeOnComplete: true
    }
};

class EmailQueue {
    constructor() {
        this.queue = new Queue('Email Queue', REDIS_URL, queueOpts);
    }
};

export default EmailQueue;

Bây giờ bạn đã khởi tạo hàng đợi, bạn có thể xác định chức năng sản xuất của mình (sử dụng Bull’s thêm vào() chức năng) như một phương pháp của EmailQueue class để thêm email vào hàng đợi nhiệm vụ. Khối mã sau minh họa điều này:

 

class EmailQueue {
    constructor () {
        
    }

    
    async addEmailToQueue(emailData) {
        
        await this.queue.add('email_notification', emailData);
        console.log('the email has been added to the queue...');
    }
};

export default EmailQueue;

Hàm sản xuất đã sẵn sàng và bây giờ bạn có thể xác định hàm tiêu dùng (sử dụng Bull’s quá trình() chức năng) để xử lý tất cả các tác vụ email trong hàng đợi—tức là gọi chức năng để gửi email. Bạn nên định nghĩa hàm tiêu dùng này trong hàm tạo của lớp.

 
class EmailQueue {
    constructor () {
        

        
       
        this.queue.process('email_notification', async (emailJob, done) => {
            console.log('processing email notification task');
            await emailHandler.sendEmail(emailJob);
            done();
        })
    }
    
};

export default EmailQueue;

Các email việc làm đối số là một đối tượng chứa các thuộc tính của tác vụ để hàng đợi xử lý. Nó cũng bao gồm dữ liệu chính cần thiết để xây dựng email. Để dễ hiểu, các gửi email() chức năng sẽ tương tự như ví dụ này:

 
const sendgridMail = require('@sendgrid/mail');

const apiKey = process.env.SENDGRID_API_KEY

sendgridMail.setApiKey(apiKey);

const sendEmail = async (emailJob) => {
    try {
        
        const { name, email } = emailJob.data;

        const message = {
            from: 'me@example.com',
            to: 'you@example.com',
            subject: 'Hi! Welcome',
            text: `Hello ${name}, welcome to MUO`
        };

        await sendgridMail.sendMail(message);

        
        await emailJob.moveToCompleted('done', true);
        console.log('Email sent successfully...');
    } catch (error) {
        
        await emailJob.moveToFailed({ message: 'task processing failed..' });
        console.error(error);
    }
}

export default sendEmail;

Bây giờ bạn đã xác định cả hàm sản xuất và hàm tiêu dùng và sẵn sàng sử dụng, bây giờ bạn có thể gọi hàm sản xuất của mình ở bất kỳ đâu trong ứng dụng của bạn để thêm email vào hàng đợi để xử lý.

Một bộ điều khiển ví dụ sẽ trông như thế này:

 
const EmailQueue = require('../handlers/queueHandler.js')

const signUp = async (req, res) => {
    const { name, email, password } = req.body;

    
    
    

    
    const emailData = { name, email };
    await EmailQueue.addEmailToQueue(emailData);

    res.status(200).json({
        message: "Sign up successful, kindly check your email"
    })
}

Của bạn queueHandler.js tập tin bây giờ sẽ như sau:

 
const Queue = require('bull');
const emailHandler = require('../handlers/emailHandler.js');

const REDIS_URL = 'redis://127.0.0.1:6379';

const queueOpts = {
    limiter: {
        max: 100,
        duration: 10000
    },

    prefix: 'EMAIL-TASK',

    defaultJobOptions: {
        attempts: 3,
        removeOnComplete: true
    }
};

class EmailQueue {
    constructor() {
        this.queue = new Queue('Email Queue', REDIS_URL, queueOpts);

        
        this.queue.process('email_notification', async (emailJob, done) => {
            console.log('processing email notification task');
            await emailHandler.sendEmail(emailJob);
            done();
        })
    }

    
    async addEmailToQueue(emailData) {
        
        await this.queue.add('email_notification', emailData);
        console.log('the email has been added to the queue...');
    }
};

export default EmailQueue;

Khi triển khai điều này trong API REST của Node.js, bạn sẽ nhận thấy thời gian phản hồi của điểm cuối đăng ký giảm và thời gian gửi email nhanh hơn so với giải pháp thay thế.

Hàng đợi tác vụ cũng cho phép bạn xử lý các lỗi đăng ký và gửi email một cách độc lập.

Tối ưu hóa ứng dụng bằng hàng đợi tác vụ

Hàng đợi tin nhắn và tác vụ là một cách tuyệt vời để cải thiện hiệu suất chung của các ứng dụng. Chúng cũng rất rẻ và bạn có thể sử dụng chúng trong bao nhiêu phần của ứng dụng mà bạn cần.

Mặc dù hướng dẫn này sử dụng email làm tình huống ví dụ để xử lý các tác vụ tiêu tốn bộ nhớ bằng hàng đợi, nhưng có nhiều trường hợp khác mà bạn có thể áp dụng các khái niệm tương tự. Chúng bao gồm các thao tác đọc/ghi nặng, hiển thị hình ảnh hoặc tài liệu chất lượng cao và gửi thông báo hàng loạt.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *