公司动态
MQTT Broker存在的必要性
为什么需要 MQTT Broker直接通信不行吗这是一个非常好的架构设计问题让我用对比分析的方式帮你理解中间件的价值。一、假设没有 Broker直接通信会怎样1.1 方案对比方案 A直接通信Client-to-Client ┌─────────────────────┐ ┌─────────────────────┐ │ 远程驾驶控制节点 │ ◄────────────────► │ 视频推流节点 │ │ (Publisher) │ │ (Subscriber) │ └─────────────────────┘ └─────────────────────┘ 需要知道对方的 IP 地址和端口 需要处理连接管理、断线重连 需要定义通信协议方案 B通过 Broker 通信 ┌─────────────────────┐ ┌──────────────┐ ┌─────────────────────┐ │ 远程驾驶控制节点 │ ──► │ MQTT Broker │ ──► │ 视频推流节点 │ │ (Publisher) │ │ │ │ (Subscriber) │ └─────────────────────┘ └──────────────┘ └─────────────────────┘ 只需要知道 Broker 地址 消息路由中心 不需要知道对方存在1.2 直接通信的问题问题说明点对点耦合控制节点必须知道视频节点的 IP/端口一个节点变更影响另一个无法扩展如果需要增加状态监控节点也想接收视频状态必须修改控制节点代码断线处理复杂需要自己实现心跳检测、断线重连、消息缓存协议定义需要自己定义消息格式、序列化/反序列化广播困难一条指令要发送给多个节点时需要维护多个连接二、Broker 的核心价值解耦2.1 什么是解耦没有解耦 (耦合): 控制节点 ──► 必须知道 ──► 视频节点的 IP/端口 │ │ │ 视频节点挂了 │ 视频节点换IP了 ▼ ▼ 控制节点必须处理 控制节点必须重新配置 有解耦 (通过 Broker): 控制节点 ──► 只知道 ──► Broker 地址 │ │ │ 视频节点挂了 │ 视频节点换IP了 ▼ ▼ 控制节点无感知 控制节点无感知2.2 实际场景远程驾驶系统假设系统中有以下节点① 远程驾驶控制节点发送 start/stop 指令② 视频推流节点接收指令推流到 RTSP③ 状态监控节点接收推流状态展示给运维④ 故障诊断节点接收异常告警记录日志如果没有 Broker控制节点 ── 指令 ──► 视频节点 控制节点 ── 指令 ──► 视频节点 (要维护连接) 视频节点 ── 状态 ──► 状态监控节点 视频节点 ── 状态 ──► 故障诊断节点 (要维护连接) 视频节点 ── 告警 ──► 故障诊断节点 视频节点 ── 告警 ──► 状态监控节点 (要维护连接) 每个节点都要知道其他所有节点的存在 新增节点时所有相关节点都要修改代码有了 Broker控制节点 ── 发布 /video_stream/cmd ──► Broker 视频节点 ── 订阅 /video_stream/cmd ◄── Broker 视频节点 ── 发布 /stream_status ──► Broker 状态监控 ── 订阅 /stream_status ◄── Broker 故障诊断 ── 订阅 /stream_status ◄── Broker 故障诊断 ── 订阅 /abnormal_status ◄── Broker 每个节点只关心自己的 Topic互不干扰三、类比理解快递系统场景没有 Broker有 Broker比喻你亲自把快递送到每个收件人通过快递公司中转发送方需要知道每个收件人的地址只需要知道快递公司地址接收方需要认识每个发件人只需要关注自己的收件箱新增收件人通知所有发件人发件人无感知失败处理亲自处理重发快递公司保证送达四、MQTT Broker 提供的核心能力4.1 消息路由Publisher 发布到 Topic A │ ▼ Broker 查找订阅了 A 的所有 Subscribers │ ▼ 转发给所有订阅者4.2 消息持久化// 代码中的设置connOpts.set_clean_session(false);// 持久会话作用: 如果视频节点暂时断线Broker 会保留消息节点重连后自动补发。4.3 QoS 保障mqtt_client_-subscribe(/video_stream/cmd,1);// QoS 1QoS 级别说明0最多一次Fire and Forget1至少一次确保送达适合控制指令2恰好一次保证只送达一次4.4 过滤匹配// 支持通配符subscribe(/vehicle//video_stream/#,1)// 可以匹配:// /vehicle/VIN001/video_stream/status// /vehicle/VIN002/video_stream/status// /vehicle/VIN001/video_stream/cmd五、对比其他通信方案方案优点缺点适用场景MQTT轻量、Pub/Sub、QoS、持久化需要部署 Broker物联网、远程驾驶、消息型数据ROS2 Topic实时性好、同机器高效仅限同机器、不跨语言机器人内部节点通信HTTP REST通用、标准化同步阻塞、无推送Web API、配置下发gRPC高性能、强类型复杂、无原生 Pub/Sub微服务间通信直接 TCP灵活需要自己实现协议定制化场景六、总结问题答案能直接通信吗技术上可以但会导致强耦合为什么用 Broker解耦、可扩展、可靠传输Broker 的成本需要额外部署一个服务Mosquitto/EMQX带来的收益新增节点无需修改现有代码、断线自动恢复、多播天然支持一句话总结Broker 是消息邮局让每个节点只需关心往哪发和收什么而不需要关心谁收和谁发。这种设计是大型分布式系统的基础模式。