首页 > 解决方案 > 基于 MQTT 的 C++ 服务的高可用性

问题描述

我编写了一些具有 MQTT 客户端的 c++ 服务。根据在 MQTT 主题上收到的消息,c++ 服务将采取一些操作,例如将 MQTT 消息发送到另一个主题或将消息保存到数据库等。

我在 Docker 上设置了一些 MQTT 代理,并将这些 MQTT 代理连接到 HA 负载均衡器。所有这些 MQTT 代理也聚集在一起。

因此,如果客户端 1 连接代理 1(通过负载均衡器)可以向客户端 x 连接代理 -x 发送消息。由于 MQTT 代理的集群。

那么,如何使用 HA 或类似的负载均衡器将负载均衡器设置为我的 c++ 服务?

更新:

在 HTTP / REST API 的情况下,请求将在任何时间点仅传输到一个 Web 应用程序。但是在 MQTT 的情况下,消息将被发布,如果我运行 Same ABC 的多个 c++ 服务,那么所有服务都将处理该消息。我应该如何确保只有一项服务会处理该消息。我想为 C++ 服务建立高可用性

标签: kubernetesmqtthigh-availability

解决方案


这在 MQTT 3.x 下是不可能的。原因是在 MQTT 5 之前,每条消息都会发送给该主题的每个订阅者,因此很难正确进行负载平衡。 订阅者需要接收所有内容,然后丢弃决定自己丢弃一些消息,将它们留给其他订阅者。这是 MQTT 3.x 的限制之一。

有些人通过将他们的 MQTT 代理连接到Apache Kafka集群,将所有消息从 MQTT 路由到 Kafka,然后将他们的订阅者(如您的 c++ 服务)附加到 Kafka 而不是 MQTT 来解决这个问题。Kafka 支持您要求的负载平衡类型。


这可能会随着 MQTT 5.0 改变。仍然有很多客户和经纪人不支持这一点。但是,如果您的客户端和代理都支持 MQTT 版本 5,则有一个“共享订阅”的新概念1

  • 共享订阅– 如果订阅的消息速率很高,则可以使用共享订阅在多个接收客户端之间对消息进行负载平衡

您还没有说明您的客户库。但是您的第一步应该是:

  • 调查您的代理和订阅者是否都支持 MQTT 5
  • 检查客户端的 API 以了解如何使用订阅者组

1 MQTT 新手,Kafka 已经拥有它。


推荐阅读