AllStar2.0/开发周期.md

29 KiB
Raw Permalink Blame History

这份是**“智能锁新实时系统方案”模块开发周期、技术栈、难点和注意事项**。

预估前提:

  • starcloudstarlockapp-starlock、现有设备端已有基础能力。
  • 新项目重点是实时控制面、BifroMQ、WebRTC/TURN/ZLMediaKit、事件链路、AI 旁路。
  • 团队配置按:后端 2 人、APP 1 人、设备端 1 人、运维 1 人、测试 1 人估算。

一、整体开发阶段建议

阶段划分

阶段 目标 周期预估
阶段 0方案细化与协议设计 确定 topic、状态机、API、媒体选路策略 1 - 2 周
阶段 1实时控制面 MVP 完成 session-orchestratordevice-bootstrap、BifroMQ 基础接入 3 - 5 周
阶段 2WebRTC / TURN / ZLM 媒体链路 完成 P2P、TURN、ZLMediaKit 基础切换 4 - 8 周
阶段 3APP 与设备端联调 APP、WiFi 锁、后台完整跑通呼叫、接听、挂断、切路 4 - 6 周
阶段 4事件、日志、可观测、弱网优化 完成事件消费、质量上报、链路追踪、告警 2 - 4 周
阶段 5AI 旁路接入 接入 ai-gatewayxiaozhi_server 2 - 4 周
阶段 6灰度上线与稳定性优化 压测、弱网测试、灰度、回滚方案 2 - 4 周

总周期预估

范围 周期
最小可用版本 MVP 8 - 12 周
可灰度上线版本 12 - 16 周
含 AI、完整动态选路、完整可观测版本 16 - 24 周

二、模块开发周期、技术栈、难点与注意事项

1. starlock 租户应用层改造

模块定位

starlock 是 APP 的统一业务入口,负责:

  • APP 登录鉴权
  • 家庭 / 门锁归属判断
  • 调用 starcloud 共享能力
  • 调用 session-orchestrator 创建实时会话
  • 下发短期会话权限
  • 处理事件回调和业务通知

开发周期

2 - 4 周

如果现有 PHP 代码结构清晰,只做 API 编排,约 2 周。
如果需要整理权限、设备归属、租户模型,可能 4 周以上。

技术栈

类型 技术
后端语言 PHP
框架 Laravel / ThinkPHP / Yii / 原有框架,按现状
API RESTful API
认证 JWT / Session / OAuth2 内部 token
数据库 MySQL / PostgreSQL
缓存 Redis
内部调用 HTTP / gRPC可先 HTTP
日志 Monolog / ELK / Loki

主要开发内容

  • 新增“创建视频会话”接口
  • 调用 session-orchestrator 创建 sessionId
  • 根据用户、家庭、门锁关系做权限校验
  • 返回 APP 所需短期 token、MQTT topic、媒体策略
  • 处理 MQTT event worker 回调
  • 处理 AI 会话状态回调
  • 保留对 starcloud 的共享能力调用

难点

  1. 权限边界

    • APP 用户是否有权访问某把锁
    • 家庭成员、租户、渠道、套餐规则是否影响通话权限
  2. 短期会话权限设计

    • APP 不能直接拿长期业务 token 去访问实时系统
    • 需要生成短期、单会话、可过期的 token
  3. 业务状态与实时状态解耦

    • starlock 不应该维护完整通话状态机
    • 它只关心会话结果、事件回调和业务通知
  4. 兼容旧链路

    • 旧 UDP 控制、旧 scd/scrd/rpcd 可能仍有设备在用
    • 需要新旧能力并存一段时间

注意事项

  • starlock 不要直接搬运 WebRTC signaling。
  • APP 不应直接访问 session-orchestrator 的内部管理接口。
  • 所有会话创建都必须经过设备归属和家庭权限校验。
  • 短期 token 要绑定:
    • userId
    • deviceId
    • sessionId
    • 过期时间
    • 权限范围
  • 事件回调要做幂等处理,防止重复消费。
  • 所有敏感操作要写审计日志。

2. starcloud 共享业务能力对接

模块定位

starcloud 是共享业务平台,主要提供:

  • 用户 / 权限策略
  • 家庭 / 设备关系
  • 套餐 / 计费
  • 审计 / 风控
  • 通用业务规则

开发周期

1 - 3 周

如果现有 API 完备,只需对接和字段适配,约 1 周。
如果需要补充共享能力 API则需要 2 - 3 周。

技术栈

类型 技术
后端 现有 starcloud 技术栈
API REST / RPC
鉴权 内部服务 token / AK-SK / OAuth2
数据库 现有Mysql数据库
缓存 Redis
审计 日志服务 / 审计表

主要开发内容

  • 提供设备归属查询能力
  • 提供用户权限策略查询能力
  • 提供风控和审计接口
  • starlock 提供标准化业务 API

难点

  • 多租户和跨项目能力边界容易混乱
  • 共享模型与 starlock 定制逻辑可能重复
  • 权限策略需要兼容现有用户体系

注意事项

  • starcloud 不直接参与实时会话状态机。
  • starcloud 只输出通用业务判断,不关心 WebRTC、BifroMQ、ZLM 细节。
  • 通用能力和租户定制能力要分清。
  • 不要把实时系统的 topic、signaling、media route 等细节侵入 starcloud

3. session-orchestrator 会话编排服务

模块定位

这是新实时系统的核心模块,负责:

  • 创建会话
  • 管理会话状态机
  • 下发控制指令
  • 处理 ACK / 超时 / 重试
  • 编排 signaling topic
  • 控制媒体选路
  • 记录会话状态和质量数据

开发周期

4 - 8 周

MVP 版本 4 周左右。
完整支持状态机、切路、追踪、重试、幂等,建议预留 6 - 8 周。

技术栈

推荐技术栈:

类型 推荐
后端语言 Go
推荐优先级 Go 或 Java 更适合长连接、并发和状态机
Web 框架 Go Fiber / Gin
内部 API REST / gRPC
MQTT Client Eclipse Paho / gmqtt / HiveMQ Client
状态缓存 Redis
持久化 MySQL / PostgreSQL
消息序列 Redis Stream / Kafka可顺续引入
日志追踪 OpenTelemetry
指标 Prometheus
配置 YAML / ENV

主要开发内容

  • CreateSession
  • InviteDevice
  • AcceptSession
  • RejectSession
  • StartSignaling
  • ReportQuality
  • SwitchRoute
  • Hangup
  • Timeout
  • Terminate
  • 会话状态机
  • MQTT topic 分配
  • 短期 token 校验
  • ACK / seq / retry
  • 会话日志落库
  • 媒体策略下发

推荐状态机

pending
  -> ringing
  -> accepted
  -> connecting
  -> connected
  -> degraded
  -> switching_route
  -> recovered
  -> ended

异常结束:
  -> rejected
  -> timeout
  -> failed

难点

  1. 状态一致性

    • APP、设备、云端三方状态容易不一致。
    • 必须通过状态机和事件序列统一收敛。
  2. ACK 与超时控制

    • invite 发出后,设备可能离线、延迟、重复 ACK。
    • 所有控制指令要有 seqacktimeout
  3. 动态选路

    • 什么时候从 P2P 切 TURN
    • 什么时候从 TURN 切 ZLM
    • 切路过程中如何不中断或少中断?
  4. 幂等性

    • APP 重试创建会话
    • 设备重复上报 accept
    • MQTT 重复投递
    • 都必须能安全处理
  5. 分布式扩容

    • 多个 session-orchestrator 实例时,会话归属、锁、状态更新要处理好。

注意事项

  • 会话 ID 必须全局唯一。
  • 所有指令都要带:
    • sessionId
    • eventId
    • seq
    • timestamp
    • expireAt
    • from
    • to
  • 状态变更必须有合法状态迁移校验。
  • 会话状态建议短期放 Redis终态落 MySQL。
  • 不建议在 MQTT retained message 中保存敏感 signaling。
  • session-orchestrator 不搬运大媒体流。
  • session-orchestrator 应只管控制面,不直接承载视频数据。

4. device-bootstrap 设备接入服务

模块定位

设备首次或周期性接入时,通过该服务获取:

  • 设备认证
  • MQTT 连接参数
  • 短期 MQTT 凭证
  • 设备 topic 权限
  • 设备能力配置
  • 固件能力声明

开发周期

2 - 4 周

如果设备认证机制已存在2 周左右。
如果需要重新设计设备证书、密钥、签名3 - 4 周。

技术栈

类型 技术
后端语言 Go / Java / PHP 均可
API HTTPS
鉴权 设备证书 / 设备密钥 / HMAC 签名
存储 MySQL
缓存 Redis
MQTT 权限 BifroMQ Auth Provider / 自定义鉴权

主要开发内容

  • 设备身份校验
  • 颁发 MQTT username/password/token
  • 生成设备 topic ACL
  • 返回 BifroMQ 连接地址
  • 返回心跳周期
  • 返回设备配置
  • 支持设备能力声明:
    • 是否支持 WebRTC
    • 是否支持 ZLM
    • 是否支持 AI 音频旁路
    • 是否支持 BLE 透传

难点

  • 设备端时间不准导致签名过期判断失败
  • 设备密钥泄露风险
  • MQTT ACL 粒度设计
  • 新旧设备兼容

注意事项

  • 不要给设备长期固定 MQTT 密码。
  • MQTT 凭证建议短期有效,可刷新。
  • topic 权限必须最小化。
  • 设备只能发布和订阅自己的 topic。
  • 设备 capability 要版本化,方便后续灰度。

5. Apache BifroMQ 模块

模块定位

BifroMQ 承担:

  • 设备在线状态
  • 发现
  • MQTT signaling
  • 事件总线
  • APP 与设备信令通道

开发周期

2 - 4 周

部署和基础联调 1 - 2 周。
完整 ACL、认证、监控、压测建议 3 - 4 周。

技术栈

类型 技术
Apache BifroMQ
协议 MQTT 3.1.1 / MQTT 5
APP 连接 MQTT over WSS
设备连接 MQTT over TLS
鉴权 自定义 Auth Provider
监控 Prometheus / Grafana
日志 Loki / ELK

Topic 设计建议

tenant/{tenantId}/device/{deviceId}/status
tenant/{tenantId}/device/{deviceId}/event
tenant/{tenantId}/session/{sessionId}/signal/app
tenant/{tenantId}/session/{sessionId}/signal/device
tenant/{tenantId}/session/{sessionId}/control
tenant/{tenantId}/session/{sessionId}/quality

难点

  1. topic 权限控制

    • APP 只能访问自己本次会话相关 topic。
    • 设备只能访问自己所属 topic。
  2. 在线状态判断

    • MQTT connected 不等于设备业务可用。
    • 需要结合心跳、lastWill、设备能力状态。
  3. QoS 选择

    • signaling 可用 QoS 1。
    • 质量上报可用 QoS 0。
    • 控制指令建议 QoS 1 + 应用层 ACK。
  4. 消息顺序

    • MQTT 不能替代完整状态机。
    • 状态一致性仍应由 session-orchestrator 控制。

注意事项

  • 不要通过 MQTT 传大视频流。
  • 不要把长期敏感 token 放在 topic 或 payload 里。
  • topic 命名要预留租户维度。
  • MQTT payload 要版本化。
  • retained message 谨慎使用,尤其是 signaling 类消息。
  • LWT 遗嘱消息要设计好,用于设备离线通知。

6. APP 端 app-starlock 改造

模块定位

APP 需要支持:

  • 调用 starlock 创建会话
  • 连接 BifroMQ
  • 订阅 session topic
  • WebRTC offer/answer/candidate
  • 媒体链路质量上报
  • 动态切路响应
  • 弱网提示
  • AI 辅助入口

开发周期

4 - 8 周

如果现有 Flutter 已有实时对讲能力,约 4 - 5 周。
如果 WebRTC 从零接入,建议 6 - 8 周。

技术栈

类型 技术
APP 框架 Flutter
WebRTC flutter_webrtc
MQTT mqtt_client / 其他 Flutter MQTT SDK
网络 Dio
状态管理 Riverpod / Bloc / Provider
本地存储 shared_preferences / hive
日志 Sentry / 自建日志上报
推送 FCM / APNs / 厂商推送

主要开发内容

  • 会话创建 API
  • MQTT over WSS 连接
  • WebRTC PeerConnection
  • ICE candidate 处理
  • offer/answer 交换
  • TURN 配置
  • ZLM 播放 / 推流能力接入
  • route switch 指令处理
  • 通话 UI 状态机
  • 通话质量上报
  • 异常提示和重连

难点

  1. Flutter WebRTC 稳定性

    • Android 和 iOS 行为不同。
    • 后台、锁屏、权限、音频路由复杂。
  2. 弱网处理

    • 网络切换 WiFi/4G
    • ICE reconnect
    • MQTT 断线重连
    • 媒体重连
  3. 状态同步

    • APP UI 状态必须跟云端会话状态保持一致。
    • 不能只靠本地 WebRTC 状态判断。
  4. 音频权限和回声消除

    • 双向语音容易出现回声、啸叫、音量问题。

注意事项

  • APP 不要保存长期 MQTT 密钥。
  • APP 进入后台时要处理 MQTT 和 WebRTC 生命周期。
  • 会话失败要区分:
    • 设备离线
    • 权限不足
    • signaling 超时
    • ICE 失败
    • ZLM 失败
  • 所有通话状态变化都要上报。
  • iOS 需要特别注意后台音视频权限和推送唤醒策略。
  • Android 需要注意不同厂商后台保活限制。

7. WiFi 网关锁 / 设备端改造

模块定位

WiFi 锁作为网关设备,需要支持:

  • HTTPS bootstrap
  • MQTT/TLS 连接
  • 在线状态上报
  • 会话 invite/accept/reject/hangup
  • WebRTC 采集、编码、推流
  • TURN / ZLM / relay 切换
  • AI 音频旁路
  • BLE 锁透传

开发周期

6 - 12 周

如果设备端已有音视频 SDK 和 WebRTC 能力6 - 8 周。
如果从零接入 WebRTC尤其是嵌入式平台可能 12 周以上。

技术栈

类型 技术
语言 C / C++
MQTT Eclipse Paho Embedded / mosquitto client / 自研
TLS mbedTLS / OpenSSL
WebRTC libwebrtc / Pion 设备适配 / vendor SDK
编码 H.264 / H.265 / AAC / Opus
媒体 GStreamer / FFmpeg / 设备厂商 SDK
存储 Flash / 本地配置
日志 本地环形日志 + 云端上报

主要开发内容

  • bootstrap 接入
  • MQTT topic 订阅和发布
  • 设备能力声明
  • 接收 invite
  • 发送 ringing/accept/reject
  • signaling 处理
  • WebRTC 建链
  • TURN 支持
  • ZLM 推流或 WebRTC 接入
  • 质量指标采集
  • route switch 响应
  • 会话结束清理
  • AI旁路转发

难点

  1. 设备性能限制

    • CPU、内存、编码能力有限。
    • WebRTC 对资源要求高。
  2. 嵌入式 WebRTC 集成难

    • ICE、DTLS、SRTP、NAT 穿透复杂。
    • SDK 移植成本高。
  3. 音视频编码兼容

    • APP、ZLM、WebRTC 对 codec 支持要统一。
    • H.264 profile、packetization mode 要注意。
  4. 切路过程中资源释放

    • P2P 切 ZLM 时要释放旧连接。
    • 防止摄像头、麦克风、编码器被占用。
  5. 断网恢复

    • 设备重连后要恢复 MQTT 状态。
    • 旧会话要能被云端清理。

注意事项

  • 设备端必须实现控制指令 ACK。
  • 设备端所有消息要带 sessionIdseq
  • 设备端不能信任任意 MQTT 消息,必须校验 token 或签名。
  • 摄像头、麦克风只能被一个会话独占,除非明确支持多路。
  • 本地日志非常重要,否则现场问题很难定位。
  • 如果设备端 WebRTC 难度过高,可以第一阶段优先走 ZLMediaKit 或厂商 SDK再逐步补 P2P。

8. WebRTC / TURN 媒体链路模块

模块定位

负责 APP 与设备之间的实时音视频链路:

  • 优先 P2P
  • P2P 不通走 TURN
  • 弱网时可切 ZLM
  • 最终兜底走中心转发

开发周期

4 - 8 周

APP、设备、服务端三方联调复杂建议至少预留 1 个月。

技术栈

类型 技术
WebRTC libwebrtc / flutter_webrtc
STUN/TURN coturn
加密 DTLS-SRTP
NAT 穿透 ICE
编码 H.264 / Opus
质量监控 getStats / 自定义质量上报

主要开发内容

  • ICE server 配置
  • offer/answer
  • candidate 收集和交换
  • TURN credential
  • 质量上报
  • P2P / TURN 判定
  • ICE restart
  • 通话异常恢复

难点

  • NAT 类型复杂
  • 对称 NAT 下 P2P 失败率高
  • TURN 成本高,带宽压力大
  • ICE 状态和业务状态不完全一致
  • 移动网络切换容易断流

注意事项

  • TURN 账号必须短期有效。
  • TURN 带宽成本要评估。
  • 不要把 TURN 当成无限免费兜底。
  • WebRTC 质量指标要持续上报:
    • RTT
    • packet loss
    • jitter
    • bitrate
    • candidate type
    • frame drop
  • 首版可以先实现“失败后重建到 ZLM”不要一开始追求无感切换。

9. ZLMediaKit 中心转发模块

模块定位

ZLMediaKit 用于:

  • 弱网优先转发
  • P2P/TURN 失败后的媒体兜底
  • 标准化流媒体接入
  • 后续录像、截图、事件视频处理

开发周期

3 - 6 周

基础部署和推拉流 1 - 2 周。
与 APP、设备、鉴权、会话状态打通约 3 - 6 周。

技术栈

类型 技术
流媒体服务 ZLMediaKit
协议 WebRTC / RTSP / RTMP / HLS / HTTP-FLV
编码 H.264 / AAC / Opus
鉴权 ZLM hook + 业务鉴权
部署 Docker / systemd
负载均衡 Nginx / SLB
监控 Prometheus exporter / 日志采集

主要开发内容

  • ZLM 部署
  • 推流地址生成
  • 播放地址生成
  • Hook 鉴权
  • 流开始 / 结束事件回调
  • session-orchestrator 对接
  • APP 播放适配
  • 设备推流适配
  • 异常断流重试

难点

  1. 协议选择

    • 设备推什么协议?
    • APP 拉什么协议?
    • 是否都走 WebRTC
  2. 延迟控制

    • HLS 延迟高,不适合实时对讲。
    • WebRTC / RTMP / HTTP-FLV 要按实际需求选。
  3. 双向语音

    • 只看视频容易,双向对讲更复杂。
    • 要确认 ZLM 在当前方案中如何承载上行音频。
  4. 鉴权和防盗链

    • 推流 / 播放 URL 必须短期有效。
    • 不能裸露固定流地址。

注意事项

  • 弱网优先 ZLM 是合理的,但要明确“实时对讲”的延迟指标。
  • 首版建议只做一套主协议,避免 RTMP、RTSP、WebRTC、FLV 全部都上。
  • ZLM 的 hook 回调要和 session-orchestrator 状态机打通。
  • 流 ID 要绑定 sessionId
  • 推流和播放权限必须过期。
  • 要有自动清理僵尸流机制。

10. media-relay 中心转发兜底模块

模块定位

media-relay 是最终兜底。
但你文档里已经明确:优先采用 ZLMediaKit 落地

开发周期

方案 周期
不自研,直接用 ZLMediaKit 承担 0 - 1 周设计适配
轻量封装 ZLM relay API 2 - 3 周

技术栈

如果不自研:

类型 技术
Relay 实现 ZLMediaKit
控制层 session-orchestrator
鉴权 ZLM hook
监控 Prometheus / 日志

如果自研:

类型 技术
语言 C++ / Go
媒体协议 RTP / SRTP / WebRTC
编码处理 FFmpeg / GStreamer
NAT ICE / TURN
难度

难点

  • 自研媒体转发成本极高
  • 音视频同步、抖动缓冲、拥塞控制都复杂
  • 稳定性和性能验证成本高

注意事项

  • 第一阶段不建议自研 media-relay
  • 先让 media-relay 成为逻辑模块,由 ZLMediaKit 实现。
  • 后续只有在 ZLM 无法满足业务需求时再考虑自研。

11. MQTT event worker / 原 event_listener 演进

模块定位

负责消费设备事件和实时事件:

  • 门锁事件
  • 设备上下线
  • 通话事件
  • 媒体事件
  • AI 事件
  • 图片 / 视频后处理
  • 回调 starlock

开发周期

2 - 4 周

技术栈

类型 技术
后端语言 Go / Java / PHP Worker / Node.js
消息来源 BifroMQ MQTT
队列 Redis Stream / Kafka / RabbitMQ可选
存储 MySQL / Redis
回调 HTTP
重试 延迟队列 / 定时任务

主要开发内容

  • MQTT 事件订阅
  • 事件解析
  • 事件幂等
  • 回调 starlock
  • 失败重试
  • 死信队列
  • 事件日志落库
  • 媒体后处理触发

难点

  • MQTT 事件可能重复
  • 设备事件顺序可能乱
  • 回调失败后要重试
  • 事件消费不能阻塞主实时链路

注意事项

  • 每个事件必须有唯一 eventId
  • 回调 starlock 要支持幂等。
  • 不要在 worker 中做耗时媒体处理,应该异步化。
  • 事件处理失败要可追踪、可重放。
  • 事件 schema 要版本化。

12. realtime-store 实时状态与日志缓存

模块定位

用于保存:

  • 会话临时状态
  • 会话质量指标
  • signaling 摘要
  • route 切换记录
  • 调试日志
  • 会话终态

开发周期

1 - 3 周

技术栈

类型 技术
热状态 Redis
持久化 MySQL / PostgreSQL
日志 Loki / Elasticsearch
指标 Prometheus
链路追踪 OpenTelemetry

数据建议

Redis

session:{sessionId}:state
session:{sessionId}:participants
session:{sessionId}:route
session:{sessionId}:quality
device:{deviceId}:online
device:{deviceId}:capability

MySQL

  • realtime_session
  • realtime_session_event
  • realtime_quality_report
  • realtime_route_switch
  • device_online_log

难点

  • 热状态和持久化状态一致性
  • 会话结束后的资源清理
  • 日志量较大
  • 敏感数据脱敏

注意事项

  • Redis key 必须设置 TTL。
  • signaling 内容不建议完整长期保存,只保存必要摘要。
  • 质量数据可以采样,不要无限写入。
  • 终态必须落库,便于审计和问题排查。
  • 需要按 sessionId 能快速查完整链路。

13. ai-gatewayxiaozhi_server AI 旁路模块

模块定位

AI 不进入主通话状态机,而是旁路能力:

  • 设备音频旁路到 AI
  • APP AI 辅助模式
  • AI 结果回传 starlock
  • 不影响主对讲链路

开发周期

2 - 4 周

如果只是接入已有 xiaozhi_server2 周左右。
如果需要实时音频流、唤醒词、语音识别、语音合成4 周以上。

技术栈

类型 技术
网关语言 Go / Python / Node.js
AI 服务 xiaozhi_server
音频协议 WebSocket / RTP / HTTP streaming
编码 PCM / Opus / AAC
鉴权 短期 token
回调 HTTP 到 starlock

主要开发内容

  • AI 会话创建
  • 音频旁路接入
  • AI 服务转发
  • AI 结果回调
  • 会话结束清理
  • AI 异常不影响主通话

难点

  • 音频格式转换
  • 实时性要求
  • AI 服务异常隔离
  • 主通话和 AI 旁路资源竞争
  • 隐私和权限控制

注意事项

  • AI 不要阻塞主对讲链路。
  • AI 失败不能导致视频通话失败。
  • AI 音频采集要经过用户授权。
  • AI 数据要做隐私合规处理。
  • AI 事件要独立状态机,不能混入主通话状态机。

14. 运维部署与基础设施模块

模块定位

负责部署:

  • BifroMQ
  • session-orchestrator
  • device-bootstrap
  • coturn
  • ZLMediaKit
  • MQTT event worker
  • Redis
  • MySQL
  • 日志、监控、告警

开发周期

3 - 6 周

MVP Docker Compose 1 - 2 周。
生产高可用部署 4 - 6 周。

技术栈

类型 技术
容器 Docker
编排 Docker Compose / Kubernetes
网关 Nginx / Ingress
证书 Let's Encrypt / 企业证书
监控 Prometheus + Grafana
日志 Loki / ELK
追踪 Jaeger / Tempo
CI/CD GitLab CI / GitHub Actions
配置 ENV / Secret / ConfigMap

难点

  • BifroMQ 集群部署
  • TURN 公网 IP 和端口规划
  • ZLM 带宽和并发压力
  • 日志量控制
  • 多服务之间配置复杂
  • 灰度和回滚

注意事项

  • coturn 必须部署在公网可达节点。
  • TURN UDP 端口范围要提前开放。
  • ZLM 和 TURN 带宽要按峰值计算。
  • 所有服务要有健康检查。
  • 生产环境密钥不能写在配置文件仓库中。
  • 日志要设置保留周期,避免磁盘被打满。
  • 要准备一键回滚方案。

三、模块优先级建议

P0第一阶段必须完成

模块 说明
starlock 会话入口 APP 创建会话必须依赖
session-orchestrator 新实时系统核心
device-bootstrap 设备拿 MQTT 凭证
BifroMQ 发现、在线、信令
APP MQTT + WebRTC 基础 APP 端通话能力
设备 MQTT + WebRTC/ZLM 基础 设备端通话能力
coturn P2P 失败补位
ZLMediaKit 基础转发 弱网和失败兜底
MQTT event worker 事件回调
基础监控日志 联调和上线必需

P1灰度上线前建议完成

模块 说明
完整 ACK / 超时 / 重试 提升状态一致性
质量指标上报 支撑动态选路
动态 route switch P2P / TURN / ZLM 切换
会话追踪 定位问题
ZLM hook 鉴权 防止盗流
TURN 临时凭证 安全必需
异常恢复 网络切换、断线重连
压测和弱网测试 上线前必需

P2后续增强

模块 说明
AI 旁路 不影响主链路,可后置
自研 media-relay 如 ZLM 不满足再考虑
高级网络评分模型 根据数据逐步优化
多区域接入 用户量上来后再做
完整录像 / 云存储 按业务套餐推进

四、关键技术难点总结

1. 控制面和媒体面解耦

难点不是画架构,而是实现时防止耦合:

  • session-orchestrator 不能直接处理视频流
  • BifroMQ 不能传大媒体
  • starlock 不能变成实时状态机
  • ZLM 不能承载业务权限判断

正确边界是:

starlock业务权限
session-orchestrator会话状态机
BifroMQ信令和事件通道
WebRTC/ZLM/TURN媒体链路
event worker异步事件处理

2. 会话状态一致性

这是整个方案最大的工程难点之一。

必须解决:

  • APP 发起了但设备没收到
  • 设备 accept 了但 APP 已取消
  • MQTT 重连导致重复消息
  • WebRTC 连上但云端状态还是 connecting
  • P2P 断了但双方状态不一致
  • 会话结束后资源没释放

建议所有状态变化都通过 session-orchestrator 收敛。


3. 媒体动态选路

动态选路不要一开始做得太复杂。

建议第一版策略:

默认尝试 P2P
  -> ICE 失败或超时,切 TURN
  -> TURN 仍失败,切 ZLMediaKit
  -> ZLMediaKit 失败,提示通话失败或走旧 relay

弱网优化版再做:

根据 RTT、丢包、jitter、candidate type、带宽评估是否提前切 ZLM

4. 设备端复杂度

设备端是高风险点。

尤其要确认:

  • 芯片性能是否支撑 WebRTC
  • 是否有硬编 H.264
  • 是否支持 Opus / AAC
  • 是否支持 TLS
  • 是否支持 MQTT 长连接
  • 摄像头和麦克风资源是否可同时给 WebRTC 和 AI
  • 固件 OTA 是否方便灰度

如果设备 WebRTC 成本过高,建议:

第一阶段:设备 -> ZLMediaKitAPP -> ZLMediaKit
第二阶段:中高端设备支持 WebRTC P2P

5. BifroMQ 权限和 topic 设计

MQTT topic 一旦上线后修改成本较高。

建议提前确定:

  • topic 命名规范
  • tenant 隔离
  • device 隔离
  • session 隔离
  • QoS 策略
  • retained 使用策略
  • LWT 设备离线策略
  • ACL 权限模型

五、上线前必须注意的点

1. 安全

必须做好:

  • MQTT TLS
  • MQTT ACL
  • 短期 token
  • TURN 临时账号
  • ZLM 播放 / 推流鉴权
  • 设备密钥不能明文泄露
  • 日志脱敏

2. 可观测性

至少要能按 sessionId 查到:

  • 谁发起
  • 哪个设备
  • 哪个 APP
  • 设备是否在线
  • invite 是否送达
  • accept 是否收到
  • offer/answer 是否完成
  • ICE 是否成功
  • 使用了 P2P / TURN / ZLM / relay 哪条链路
  • 失败原因是什么
  • 最终状态是什么

否则后期排查会非常痛苦。


3. 弱网和异常测试

必须覆盖:

  • APP 4G / WiFi 切换
  • 设备断网重连
  • MQTT 断线重连
  • TURN 不可用
  • ZLM 不可用
  • BifroMQ 重启
  • session-orchestrator 重启
  • APP 杀进程
  • 设备重复上线
  • 双端同时挂断
  • 多个 APP 同时呼叫同一把锁

4. 资源和成本

需要重点评估:

资源 风险
TURN 带宽成本高
ZLMediaKit 中心转发带宽和 CPU 压力
BifroMQ 长连接数量
Redis 会话状态和 TTL 清理
日志系统 signaling 和质量上报可能量很大
MySQL 会话事件写入频率

六、推荐的第一阶段 MVP 范围

第一阶段不要一次性做太满,建议 MVP 范围如下:

必做

  • starlock 创建会话 API
  • session-orchestrator 独立服务
  • BifroMQ 接入
  • APP MQTT over WSS
  • 设备 MQTT/TLS
  • 基础 invite / accept / reject / hangup
  • WebRTC P2P 基础链路
  • coturn 兜底
  • ZLMediaKit 兜底链路
  • 基础质量上报
  • 基础会话日志
  • 事件 worker 回调 starlock

暂缓

  • AI 深度集成
  • 自研 media-relay
  • 复杂无感切路
  • 多区域部署
  • 高级网络评分模型
  • 全量录像和云存储
  • 复杂套餐计费联动

七、建议的里程碑排期

第 1 - 2 周:协议和架构落地

  • 确定 API 文档
  • 确定 MQTT topic
  • 确定状态机
  • 确定 route 策略
  • 确定设备 capability schema
  • 搭建 BifroMQ、coturn、ZLM 测试环境

第 3 - 6 周:控制面 MVP

  • session-orchestrator
  • device-bootstrap
  • starlock 会话入口
  • APP MQTT
  • 设备 MQTT
  • invite / accept / hangup 跑通

第 7 - 10 周:媒体链路 MVP

  • WebRTC P2P
  • TURN
  • ZLM 推拉流
  • APP 与设备完整通话
  • 失败后切换到 ZLM

第 11 - 14 周:稳定性和可观测

  • ACK / retry / timeout 完善
  • 质量上报
  • 会话追踪
  • 事件 worker
  • 日志和监控
  • 弱网测试

第 15 - 16 周:灰度上线

  • 小范围设备灰度
  • 问题收集
  • 性能压测
  • 回滚方案
  • 运维文档

八、最终建议

这个架构方向是合理的,关键是第一阶段要控制范围。

我建议优先落地这条主链路:

APP
 -> starlock
 -> session-orchestrator
 -> BifroMQ signaling
 -> 设备
 -> WebRTC P2P / TURN
 -> 失败后 ZLMediaKit

同时把 AI、自研 relay、高级动态选路放到第二阶段。

最需要重点投入的模块是:

  1. session-orchestrator 状态机
  2. BifroMQ topic / ACL / token 设计
  3. APP 与设备端 WebRTC 联调
  4. ZLMediaKit 弱网兜底
  5. 会话日志与问题追踪

如果这 5 个点做好,后续 AI、录像、套餐、计费、多区域扩容都可以逐步叠加。