主题即接口
主题区分大小写,连续斜杠会产生空层级,以斜杠开头会多出一个无名的前导层级,一般不建议。好的主题设计让订阅方可以用单层通配符和多层通配符按维度切片,例如按站点订阅或按设备类型订阅;同时每个层级的内容保持稳定,设备改名或位置调整不会改变主题结构。
推荐的结构
推荐的结构
# 层级:企业 / 站点 / 设备类型 / 设备编号 / 数据类别
# 遥测:acme/shanghai/plc/line1-03/telemetry
# 状态:acme/shanghai/plc/line1-03/status
# 指令:acme/shanghai/plc/line1-03/cmd
# 订阅:acme/shanghai/plc/+/telemetry 收全厂遥测
# 避免:把时间戳、坐标或随机串放进层级层级设计对照
| 做法 | 示例 | 评价 |
|---|---|---|
| 维度固定、值可变 | site/device-type/device-id/data | 推荐,通配符可按维度切片 |
| 时间戳放载荷 | 主题固定,载荷内含时间字段 | 推荐,便于判断数据新鲜度 |
| 时间放进主题 | device/20261017/telemetry | 不推荐,主题数量随时间无限膨胀 |
| 以斜杠开头 | /acme/device/data | 不推荐,产生空的前导层级 |
| 层级堆叠属性 | device/id/type/room/floor/... | 不推荐,位置调整就会破坏订阅 |
典型使用场景
- 平台侧聚合:按站点或设备类型用通配符订阅,新增设备无需修改平台配置
- 权限隔离:以主题前缀作为授权边界,设备只能写入自己的前缀
- 数据分区:按主题前缀把消息路由到不同的存储或计算管道
- 多租户:以租户标识作为最高层级,天然隔离不同客户的数据
主题数量与订阅关系数量都会消耗服务端内存。主题设计得过于细碎会明显抬高代理的资源占用,需要在业务维度与资源开销之间权衡。
主题改名的连锁代价很大:订阅方、权限规则、路由规则都要同步修改。命名规范应在设计阶段写成文档并做评审。