异步命令、事件与状态收敛

设备、媒体、录像和宿主操作往往不能在一次 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。

客户端至少处理:

重连可以立即尝试一次,再按 1、2、5、10 秒退避,最大 30 秒。不能假设断线期间消息永远不丢失。

迟到结果

命令正式 TimedOut 后,设备仍可能迟到返回成功。平台保留 late result 审计,但不会反向覆盖已经对外形成的终态。客户端应同时展示正式状态与迟到证据,不要把它误判为数据损坏,也不要自动把超时业务改成成功。

第三方通知

需要业务通知时使用公开的第三方 Webhook 方案,按文档检查验签、事件去重与失败重试;不要调用产品组件接口。

状态机检查表

完整 Skill 文件目录