05 · 实时通讯与服务监控
父文档:../00-需求总览.md · 对应需求 7/10 · 决策 D6(部分) · 风险 R9
1. 现状(已核对修正)
实时显示是 MQTT 推送 + HTTP 轮询混合,不是"纯 5 秒轮询":
- 舱室温压/状态/报警 = MQTT 订阅推送(operate
MainPageViewModel.RecMqttMessage:512,订 TL/House/surface/{tlSn})。
- 设备列表/运行时间/报警计数/培养记录 = HTTP 5 秒轮询(
StartThread:741-770)。
薄弱点:
- control MQTT 保活 TryPing 循环被
return; 屏蔽(MqttService.cs:81);WithCleanSession() 断线漏发不补。
- 断线仅写日志、无任何 UI 失联提示(operate/control 均是)。
- 在线态(HTTP
online) 与 舱室态(MQTT) 来源割裂:broker 掉线但 HTTP 正常时,界面仍显"在线"、数据已停更,用户无感知。
2. 需求 10:实时显示准确稳定
- 指标(🔶待定具体值):状态刷新延迟上限(建议 ≤2s)、断线检出时间、重连最大时延,作为验收标准。
- 就近取数:合并后 operate 优先直接读 control 内存/事件(本机实时),服务器仅用于跨端/历史,不再绕服务器一圈拉回。
- 推送优先:实时状态走 MQTT/事件驱动,5 秒轮询降级兜底;恢复被屏蔽的保活心跳。
- 链路健康可视化:界面显示服务器连接/MQTT/上报队列/最后成功通讯时间;断线/过期显著提示,不"假装实时"。
- 稳定性兜底(分两类):
- 状态类:断网缓存最近状态 + 标注"离线/数据时间",恢复自动补齐。
- 临床数据类(图片/记录/标定):⚠️ 现状图片直接落盘 tmpDir、无明确补传队列,关系病例数据完整性,需单独确认补传机制(落盘队列+断点续传+去重)。
3. 需求 7:服务监控页(只读)
- 入口:设置页新增"服务运行监控"。
- 背景:合并后 control 是后台线程、本身无界面,把其运行状态可视化。
- 显示(实时,来自 control 内存/事件):服务器通信、CCD、拍照状态、温度、气体状态、数据上传队列、MQTT、磁盘。
- 只读:不做任何修改/新增/删除。受众=运维工程师。
- 与需求 10 链路健康打通:同一页展示通讯健康 + 最后通讯时间 + 断线告警。
4. front-management 一致性(详见 08)
front-management 订 TL/House/pc、5s/60s 轮询、有 ResolutionAdapter。三端(control/operate/front)状态同源但主题/接口不同。本轮需保证对焦相关状态语义一致(尤其新对焦的失败/中间态,front 不能显示成"正常")。
5. 验收
- 舱室状态刷新延迟 ≤ 约定值;断线在约定时间内检出。
- 断网时界面有显著失联提示、不显示过期数据为实时。
- 恢复后状态自动补齐;图片/记录按补传机制不丢。
- 服务监控页只读、实时、含链路健康。
6. 全量操作日志链路(可观测性,见 14)
服务监控之外,系统新增全量操作日志作为问题定位/可观测性基座:
- C#/Java 所有操作经 Kafka(
tl-oplog) → 日志微服务 aivfo-oplog → log 库 operation_log。
- 出问题时按
trace_id 把一次操作的跨端日志拉成时间线,定位失败步骤与输入/错误。
- 两级日志:操作级入库(长期、可查、AI 可分析);调试级(串口/相机原始细节)走本地文件、按模块/按舱热开。
- 详见子文档 14。