组内只投一份
普通订阅里每条消息会复制给所有订阅者;共享订阅在主题过滤器前加上共享前缀与组名,订阅同一组名的多个客户端构成一个消费者组,代理把每条消息只交给组内一个成员。不同组名之间相互独立,仍然各自收到一份。
语法示例
语法示例
# 语法:共享前缀 / 组名 / 主题过滤器
# 例:$share/workers/acme/shanghai/plc/+/telemetry
# 同一组名下的多个客户端构成消费者组,消息在组内分配
# 不同组名的客户端各自收到一份消息
# 不加共享前缀时为普通订阅,所有订阅者都收到与普通订阅对照
| 维度 | 普通订阅 | 共享订阅 |
|---|---|---|
| 投递方式 | 每个订阅者各收到一份 | 组内只投给一个成员 |
| 扩展方式 | 增加订阅者会成倍放大下行流量 | 增加成员可分担处理压力 |
| 语义 | 广播 | 队列式消费 |
| 适用数据 | 状态、通知、多消费者各自处理 | 任务分发、数据入库等互斥消费 |
典型使用场景
- 数据入库:多个写入实例分担同一批设备的遥测数据
- 告警处理:多个处置服务竞争同一条告警,避免重复派单
- 计算任务分发:把耗时的解析任务分给多个工作节点
- 批量补偿:上线新的消费者组时与旧组并行运行,逐步切流
共享订阅在 5.0 规范中已有对应定义,但在早期版本中属于服务端扩展:不同实现对分组策略、未确认消息处理与持久会话配合方式差异较大,上线前要实测。
消费者组内成员全部离线时,消息不会因为共享订阅而变得可靠,仍取决于会话保持与服务端积压策略,需要一并设计。