异步命令、事件与状态收敛
设备、媒体、录像和宿主操作往往不能在一次 HTTP 请求内完成。可靠客户端必须区分“命令是否执行”和“业务结果是否就绪”。
flowchart LR
S([开始]) --> P[Pending]
P --> R[Running]
R --> O{进入终态}
O --> X[Succeeded · Failed · TimedOut · Cancelled]
通用状态
常见过程状态包括 Pending、WaitingDependency、Dispatched、Running,终态包括 Succeeded、Failed、TimedOut、Cancelled。历史模块可能出现 Queued 或 Canceled 等拼写;未知值应展示并上报,不能导致整个响应反序列化失败。
命令与业务结果
| 场景 | 命令成功后还要确认 |
|---|---|
| 启动流 | MediaServer 真实流在线 |
| 协议控制 | 设备响应与协议会话收敛 |
| 开始录像 | 会话运行、文件产生并索引 |
| 裁剪合并 | 输出文件存在、时长和内容正确 |
| 生命周期 | 进程、health、MediaServer 和任务恢复 |
| RTC | ICE 与媒体真实连通 |
轮询
保存 commandId/sessionId/correlationId,按 1、2、5、10 秒退避查询。客户端自身超时后不要再次 POST;先查询命令、资源或会话是否已经存在。
依赖命令必须保存完整依赖链。上游失败或超时时,下游不得假装执行成功。
运行态 WebSocket
先读取 /api/v2/events/runtime/info 的协议信息,再连接 /api/v2/events/runtime/ws,使用子协议 akstream-runtime-v1。
客户端至少处理:
- 初始 snapshot;
- 增量 event;
- sequence/eventId 排序、去重与缺口;
- ping/pong;
- 权限失效和服务端关闭;
- 重连后的 REST 快照校准。
重连可以立即尝试一次,再按 1、2、5、10 秒退避,最大 30 秒。不能假设断线期间消息永远不丢失。
迟到结果
命令正式 TimedOut 后,设备仍可能迟到返回成功。平台保留 late result 审计,但不会反向覆盖已经对外形成的终态。客户端应同时展示正式状态与迟到证据,不要把它误判为数据损坏,也不要自动把超时业务改成成功。
第三方通知
需要业务通知时使用公开的第三方 Webhook 方案,按文档检查验签、事件去重与失败重试;不要调用产品组件接口。
状态机检查表
- 写操作保存稳定业务键与返回 ID。
- 事件按 eventId 去重。
- 终态后再检查最终业务资源。
- 只用稳定 failureCode 控制分支,不匹配本地化错误文案。
- 超时先查询,重试前判断操作是否可安全重放。
- 断线后用 REST 校准。
- 状态转移和补偿进入审计。