当我们使用自动缩放订阅服务时,RabbitMQ订阅会收到重复消息

时间:2020-03-26 09:23:28

标签: javascript node.js rabbitmq mqtt

我正在为我的IOT设备使用RabbitMQ将数据推送到服务器。从RabbitMQ,我正在使用nodejs服务来订阅特定主题的数据。为了获得更大的可用性,请为此服务使用自动缩放。当服务将根据其需求扩展时,它可以在2个或3个实例中运行。因为这2或3个实例,它将多次订阅来自主题的相同消息。我如何防止这种情况(订阅同一主题的多个实例不会重复)。一个实例读取消息应从RabbitMQ主题中删除,我该如何解决呢?

请建议:

我的代码是这样的:

var mqtt = require('mqtt');
var clientId = 'mqttjs_' + Math.random().toString(16).substr(2, 8)
var client = mqtt.connect({
    clientId: clientId,
    host: "mqtt.host.co",
    port: 8883,
    'username': "user_name",
    'password': "password",
    protocol: 'mqtt.MQTTv311',
    resubscribe: true
});
// for topics starting at topic_name/
client.subscribe('topic_name/#', { qos: 0 })  

2 个答案:

答案 0 :(得分:0)

您需要的是共享订阅。这允许一组客户订阅一个主题,并且任何给定的消息将仅传递到该组中的一个。您可以找到共享订阅here

的更详细说明

共享订阅是MQTT v5规范的一部分,但是某些经纪人在其MQTT v3.x版本中添加了具有促进性的实现。

我不确定RabbitMQ是否支持共享订阅,因为我还没有任何文档,或者我看过也没有。

答案 1 :(得分:0)

我认为您要尝试提供的是RabbitMQ代理的扩展。正如您所发现的那样,自动缩放只会启动多个RabbitMQ实例并弄乱您的消息传递总线。如果需要扩展更多的代理以支持更多的客户,则需要查看RabbitMQ群集:https://www.rabbitmq.com/clustering.html