【问题标题】:How to make sure AMQP message is not lost in case of error in subscriber with rhea?如何确保 AMQP 消息在 rhea 订阅者出错的情况下不会丢失?
【发布时间】:2020-04-03 06:58:27
【问题描述】:

因此,我在 JS 中使用 rhea 设计了一个基本的发布者-订阅者模型,该模型接受一个 API 请求以将数据保存在 DB 中,然后将其发布到队列中。

从那里订阅者(添加下面的代码)将其拾取并尝试将其保存在数据库中。现在我的问题是这个数据库实例在开发期间经历了很多变化,并且可能在插入操作期间导致错误。

所以现在当订阅者尝试推送到这个数据库并导致错误时,数据会因为出队而丢失。我是 JS 的新手,所以有没有办法确保消息不会出队,除非我们确定它已正确保存,而不必在出错时再次发布它?

我的订阅者的代码:

const Receiver = require("rhea");
const config = {
    PORT: 5672,
    host: "localhost"
};
let receiveClient;
function connectReceiver() {
    const receiverConnection = Receiver.connect(config);
    const receiver = receiverConnection.open_receiver("send_message");
    receiver.on("connection_open", function () {
        console.log("Subscriber connected through AMQP");
    });
    receiver.on("error", function (err) {
        console.log("Error with Subscriber:", err);
    });
    receiver.on("message", function (element) {
        if (element.message.body === 'detach') {
            element.receiver.detach();
        }
        else if (element.message.body === 'close') {
            element.receiver.close();
        }
        else {
             //save in DB
        }
    }
    receiveClient = receiver;
    return receiveClient;
}

【问题讨论】:

    标签: javascript amqp rhea


    【解决方案1】:

    您可以使用这样的代码来明确接受消息或将其释放给发送者:

    try {
        save_in_db(event.message);
        event.delivery.accept();
    } catch {
        event.delivery.release();
    }
    

    请参阅delivery docs 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多