Skip to content

消息总线拓扑

平台的松耦合靠 RabbitMQ 一条总线维系:服务间不直接调用的大部分异步流量,都走一组按业务域命名的 topic 交换机。这页给出全量拓扑清单——每个交换机、队列、路由键前缀、TTL 与死信去向,以及"谁发布、谁消费"。排障时对着 RabbitMQ 管理页(15672)看积压,从这张表就能定位卡在哪条链路。

你在这里:数据平面 / 命令平面讲了两条主链路的流转细节;这页是总账——包括注册、状态、告警、元数据、事件这些前面没展开的域。名字全部取自 RabbitConstant.java,以代码为准。

命名规则

  • 交换机:dc3.e.<域>;队列:dc3.q.<域>[.<细分>];路由键:dc3.r.<域>.<前缀>
  • 队列名带点号后缀(如 dc3.q.point_command.)的是每消费者前缀队列——每个驱动节点持有自己的队列(如 dc3.q.point_command.dc3-driver-mqtt),命令按节点定向路由。
  • 可选系统属性 dc3.rabbit.tag 会作为前缀注入全部名字(默认为空)——多套栈共用一个 RabbitMQ 时用它隔离。

全量清单

值与命令(详见数据/命令平面页)

交换机队列路由谁发布 → 谁消费说明
dc3.e.valuedc3.q.value.pointdc3.r.value.point.*驱动 → 数据中心位号值主链路;TTL 7 天
dc3.e.point_value_deaddc3.q.point_value_dead值队列死信消费端拒绝且不重入时落入
dc3.e.point_commanddc3.q.point_command.<节点>dc3.r.point_command.<节点>数据中心 → 目标驱动位号读写命令;队列 TTL 30 秒(超时即死信)
dc3.e.point_command_deaddc3.q.point_command_dead命令队列死信过期/重试耗尽的命令
dc3.e.point_command_resultdc3.q.point_command_resultdc3.r.point_command_result.<节点>驱动 → 数据中心命令执行回执;TTL 60 秒

自定义指令与事件

交换机队列谁发布 → 谁消费说明
dc3.e.commanddc3.q.command.<节点>数据中心 → 目标驱动设备级自定义指令(CommandCallDTO,与位号命令是两套命名空间)
dc3.e.command_resultdc3.q.command_result驱动 → 数据中心自定义指令回执
dc3.e.command_deaddc3.q.command_dead指令死信
dc3.e.eventdc3.q.event.<租户>驱动/数据中心 → 数据中心事件上报(dc3_event_history),可触发告警

注册与元数据

交换机队列谁发布 → 谁消费说明
dc3.e.registerdc3.q.register.up驱动 → 数据中心驱动上线注册(属性定义随注册报送)
dc3.q.register.down.<节点>驱动 → 数据中心驱动下线通知(每节点一队列)
dc3.e.metadatadc3.q.metadata.driver.<节点>管理中心 → 数据中心元数据变更通知(驱动维度的缓存失效)

状态与超时

交换机队列说明
dc3.e.statedc3.q.state.driver / dc3.q.state.device驱动/设备的在线状态心跳(dc3_entity_state 租约的来源)
dc3.e.state_timeout_delaydc3.q.state_timeout.driver.45s(TTL 45 秒)延迟队列:驱动心跳到期检测
dc3.e.state_timeout_checkdc3.q.state_timeout.driver_check到期后执行"判离线"动作
同上dc3.q.state_timeout.device_scan_tick.10s(10 秒)设备扫描的定时 tick
同上dc3.q.state_timeout.device_scan设备扫描执行队列

告警与通知

交换机队列谁发布 → 谁消费说明
dc3.e.alarmdc3.q.alarm.driver / dc3.q.alarm.device数据中心(告警引擎)→ 自身告警产生(dc3_entity_alarm)与规则评估入口
dc3.q.notify.task(TTL 24 小时)告警 → 通知发送器通知投递任务;渠道(邮件/短信/Webhook)见告警与通知

MQTT 桥

交换机队列说明
dc3.e.mqttdc3.q.mqtt平台内部 MQTT 消息桥(MQTT 驱动与消息总线的转发通道)

排障用法

  1. 积压在哪条队列:RabbitMQ 管理页 → Queues → 按 messages ready 排序;
  2. 对照上表找到"谁消费"——dc3.q.value.point 积压是数据中心消费慢(批处理阈值/并发),dc3.q.point_command.<节点> 积压是该驱动离线(无人消费,30 秒后死信);
  3. 死信队列有货:说明消息被拒绝或过期——按对应域查消费端日志(basicReject/basicNack 会记录原因);
  4. 队列不存在:检查消费者是否注册(驱动未上线时其前缀队列不会创建)。

延伸阅读

基于 AGPL-3.0 协议发布