共享订阅

更新时间:

本文为您介绍MQTT共享订阅特性。

能介

MQTT 3.3.1、5.0引入了共享订阅(Shared Subscription)特性,这是一种通过在多个客户端间分发消息的方式,使得负载均衡成为可能。在标准的MQTT协议中,每个订阅相同主题的客户端都会收到该主题的每条消息副本。共享订阅改变了这一行为,让消息能够在一组客户端间进行分发,每条消息只会发送给订阅该共享主题的任一个客户端。

使用限制

  • 目前仅专业版和铂金版支持该功能,且需要提交工单申请。

  • 目前共享订阅仅支持qos1语义,即至少一次投递。在客户端消费慢、客户端断线重连、服务端升级、服务端宕机等场景下会产生消息重复推送。

  • 消费者组数量不超过5000。

应用场景

  • 负载均衡:在大规模分布式系统中,共享订阅可以实现客户端间的负载均衡,特别是在消息量巨大时。

  • 系统冗余和可靠性:可以通过运行多个客户端实例来提高系统的冗余性和可靠性,如果一个客户端失败,其他的客户端可以替补。

  • 高可用性的服务:共享订阅可以提供高可用性服务,通过多个处理节点确保服务的稳定性和持续性。

消息示例

假设一个消息系统,后端有多个工作节点负责处理推送到orders/new主题的新订单消息。通过利用共享订阅,订单能够被均匀分配给所有在线的工作节点处理。

以下是工作节点客户端的订阅情况:

SUBSCRIBE
Topic Filter: $share/group1/orders/new

这里,$share/group1/是共享订阅的标识,group1是此共享订阅的组名,orders/new为客户端实际订阅的共享主题。

当有新的订单消息发布到orders/new时,只有其中一个订阅了共享订阅主题的客户端会接收并处理这个订单:

PUBLISH
Topic: orders/new
Payload: { "order_id": "xyz", "product": "ABC" }

MQTT Broker会按照某种算法(比如轮询,随机,哈希等)在group1组中的客户端间平均分发消息,以实现负载均衡。

共享订阅使得MQTT更适用于处理大流量,要求高可用性和可靠性的企业级应用。通过共享订阅,能够有效地将消息负载分散到多个订阅者上,而不是由单个订阅者承担所有工作,能够提高系统的扩展性和健壮性。