自动化 Socket 协议设计:消息序列、心跳、幂等重试与背压

自动化 Socket 协议设计:消息序列、心跳、幂等重试与背压

摘要:TCP/WebSocket 能可靠传输字节或消息,不代表自动化任务只执行一次。断线重连、超时重试和慢设备会造成重复动作、消息堆积与失控。本文设计带版本、序号、幂等键、确认、心跳、租约和背压的应用层协议。

一、消息信封

json 复制代码
{
  "protocol": "autotest/2",
  "message_id": "msg-0018",
  "task_id": "task-demo-31",
  "step_id": "launch",
  "attempt": 1,
  "type": "COMMAND",
  "sent_at": "2026-07-14T08:00:00Z",
  "payload": {"action": "app.launch"}
}

二、序号与确认

连接内序号用于检测缺口和重复;业务确认返回 message_id + execution_id + result。收到 ACK 只表示服务端接受还是执行完成,必须用不同状态明确表达。

三、幂等

服务端以 task_id + step_id 查执行记录。重复命令若已完成,返回原结果;若执行中,返回当前 execution_id;非幂等动作必须有唯一事务保护。

四、心跳

心跳证明通道活着,不证明应用 ready。分别维护:

  • transport heartbeat;
  • agent health;
  • device health;
  • task progress。

心跳携带随机 nonce 或序号,ACK 回显以测量 RTT 和识别旧包。

五、重连退避

异常断开后使用随机抖动和指数退避,避免大量客户端同时重连。RFC 6455 也建议异常关闭后延迟并逐步增加重试间隔。

六、背压

text 复制代码
max_inflight_commands
max_queue_bytes
max_artifact_streams
high_watermark / low_watermark

达到高水位暂停普通任务,优先心跳、取消和错误消息。不能让大文件传输挤死控制通道。

七、控制与数据分离

命令/状态走控制通道,大型 Trace 和截帧走独立数据通道或对象存储;控制消息只引用 artifact_id、大小和哈希。

八、租约与脑裂

设备任务携带 lease_id 和 generation。旧连接恢复后若 generation 过期,所有写命令被拒绝,避免两个调度器同时控制设备。

九、错误模型

text 复制代码
RETRYABLE_TRANSPORT
RETRYABLE_DEVICE_BUSY
PERMANENT_UNSUPPORTED
TASK_CANCELLED
LEASE_EXPIRED
DUPLICATE_COMPLETED

十、安全

使用认证与加密通道,限制消息大小和 JSON 深度,对 action 采用允许列表;日志屏蔽 Token、账号、设备 ID 和内部地址。

结语

可靠传输只是协议底座。自动化系统还需要应用级幂等、任务状态、心跳分层、租约和背压,才能在断线、慢设备和批量并发下保持可控。

参考资料:RFC 6455 WebSocket

相关推荐
外收内放5 小时前
面向对象高级(实战案例)
开发语言·python·学习
专业程序开发源5 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
FPGA小迷弟5 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
c++·python·ai·plotly·django·ai编程·claude
卷无止境5 小时前
面向arm64桌面客户端开发全景:语言、框架与生态
后端·python
fanruitian6 小时前
python else用法
开发语言·python
Thinker QAQ6 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
用户8356290780516 小时前
如何使用 Python 对 Excel 数据进行分组和分级显示
后端·python
vx_Biye_Design6 小时前
django房屋租赁推荐系统78455-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·express
学Linux的语莫8 小时前
python中类的常见写法
开发语言·python·状态模式
垆边人似月.9 小时前
Python中如何使用get函数实现频次查询
服务器·前端·python