【问题标题】:RabbitMQ subscription getting duplicate messages when we use autoscaling subscription service当我们使用自动缩放订阅服务时,RabbitMQ 订阅获取重复消息
【发布时间】:2020-03-26 09:23:28
【问题描述】:

我正在为我的 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 })  

【问题讨论】:

  • 顺便说一句,如果 MQTT Node.JS 模块不在连接选项中,它将为您自动生成一个 clientId。

标签: javascript node.js rabbitmq mqtt


【解决方案1】:

您需要的是一种叫做共享订阅的东西。这允许客户端组订阅一个主题,并且任何给定的消息将仅传递给该组中的一个。您可以找到共享订阅的更详细说明here

共享订阅是 MQTT v5 规范的一部分,但一些代理在他们的 MQTT v3.x 构建中包含了适当的实现。

我不确定 RabbitMQ 是否支持共享订阅,因为我不是任何文档,或者当我查看时。

【讨论】:

  • RabbitMQ 没有共享订阅。 RabbitMQ 中还有其他可用的选项吗?
【解决方案2】:

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

【讨论】:

  • 对 RabbitMQ 集群没有任何问题。我在订阅服务集群中遇到问题
猜你喜欢
  • 2015-04-10
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
相关资源
最近更新 更多