RabbitMQ - Cách thiết lập không mất tin khi triển khai nodejs rabbitmq

Nội dung bài viết

Lý do vì sao nên sử dụng RabbitMQ, và vì sao nên dùng nodejs RabbitMQ, thì đã có ở những bài trước. Ở bài viết này chỉ chia sẻ cách vận chuyển tin nhắn khi RabbitMQ khởi động lại. Bài viết này dành cho những anh em đã biết và sử dụng RabbitMQ rồi.

Anh em cũng biết trong môi trường product nó khác với test. Không hệ thống nào là hoản hảo hết, cách tổ chức tốt nhất là giảm tỷ lệ crash mà thôi. Ví dụ 1 năm chết server 2%, thì cố gằng cải tổ nó chỉ còn 1% là hạnh phúc rồi. RabbitMQ không ngoại lệ, nó cũng bị miss như kết nối qua cao, nghẽn, hoặc thay đổi ổ đĩa...

nodejs rabbitmq Chính vì vậy để tránh một số tính huống như trên thì cách tốt nhất sử dụng một cơ chế kết nối lại tự động phải được thực hiện trong code của mình, nếu không ứng dụng Node.js sẽ bị sập khi RabbitMQ đột tử . Đây là một ví dụ mã về kết nối lại tự động để bạn tham khảo:

Reconnect RabbitMQ

Sender: sender_reconnect.js

const amqp = require("amqplib");

const queue = "demo";

var connection;

// Kết nối RabbitMQ
async function connectRabbitMQ()
{
    try
    {
        connection = await amqp.connect("amqp://localhost");
        console.info("connect to RabbitMQ success");

        const channel = await connection.createChannel();
        await channel.assertQueue(queue);
        await channel.sendToQueue(queue, new Buffer("Hello, Anonystick!"),
        {
            // RabbitMQ - Khi khởi động lại, tiếp tục chạy
            persistent: true
        });

        connection.on("error", function(err)
        {
            console.log(err);
            setTimeout(connectRabbitMQ, 10000);
        });

        connection.on("close", function()
        {
            console.error("connection to RabbitQM closed!");
            setTimeout(connectRabbitMQ, 10000);
        });

    }
    catch (err)
    {
        console.error(err);
        setTimeout(connectRabbitMQ, 10000);
    }
}

connectRabbitMQ();

Receiver: receiver_reconnect.js

const amqp = require("amqplib");

const queue = "demo";

var connection;

//  Connect RabbitMQ
async function connectRabbitMQ()
{
    try
    {
        connection = await amqp.connect("amqp://localhost");
        console.info("connect to RabbitMQ success");

        const channel = await connection.createChannel();
        await channel.assertQueue(queue);
        await channel.consume(queue, async function(message)
        {
            console.log(message.content.toString());
            channel.ack(message);
        });

        connection.on("error", function(err)
        {
            console.log(err);
            setTimeout(connectRabbitMQ, 10000);
        });

        connection.on("close", function()
        {
            console.error("connection to RabbitQM closed!");
            setTimeout(connectRabbitMQ, 10000);
        });

    }
    catch (err)
    {
        console.error(err);
        setTimeout(connectRabbitMQ, 10000);
    }
}
connectRabbitMQ();

Nodejs RabbitMQ

Trong trường hợp này, ngay cả khi RabbitMQ khởi động lại, người gửi và người nhận có thể tự động kết nối lại RabbitMQ. Vậy thôi đơn giản thôi, đương nhiên ví dụ sẽ không hoàn hảo cho tất cả trưởng hợp nhưng bạn có thể dựa vào đó làm nên điều tuyệt với. Như demo "Hello world", nó làm nên tất cả.

Có thể bạn đã bị missing