kubernetes - 基于 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++ 服务建立高可用性
解决方案
这在 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 已经拥有它。
推荐阅读
- ruby-on-rails - 如何在 Heroku 上重置 Postgresql 表的 id 序列
- machine-learning - 如何将用户输入列表传递给预测模型
- javascript - 从localStorage获取时如何检查空/未定义的字符串值
- sql - 查询以显示值的名称而不是一个表中的 ID
- c - linux kernel 4.12中wake_up_interruptible()的正确用法是什么?
- c - 如何使用 getchar 监控用户输入
- build - 如何启用 DRAFT API for zeromq/cppzmq 以使用 vcpkg 在 Windows 上构建?
- core-data - 将已删除的 CKRecord 与 CoreData NSManagedObject 协调一致
- matlab - 如何避免用于矩阵所有排列相乘的for循环?
- flutter - 如何在颤动中为 ClipOval 添加阴影?