重连(reconnect) 协议
别名:
重连
断线后客户端重新建立事件流连接的行为。重连时携带上次看到的进度指针(`since=N`),服务端只回放 `seq > N` 的增量,避免全量重放浪费带宽。重连时机由产品决定(重试策略、指数退避、多客户端同时恢复),与 SSE 传输层的自动重连(`Last-Event-ID`)不同——协议语义走应用层。
它是什么
重连(reconnect)指断线后客户端重新建立事件流连接的行为。重连的关键不是「重新连上」,而是带着上次看到的进度指针回来:GET /events?since=N,服务端只回放 seq > N 的增量,避免全量重放浪费带宽——断线窗口越长、会话越大,省下的越多。
与 SSE 自动重连的区别
浏览器 EventSource 断线会自动重连并带上 Last-Event-ID 请求头——但那是 SSE 传输层的机制,与「连接」绑定、由浏览器隐式发起,非 SSE 客户端拿不到。本教程的重连时机由产品决定(重试策略、指数退避、多客户端同时恢复同一条流),since 是应用层协议参数,任何 HTTP 客户端都能用。这就是 ch15 定的规矩的兑现:协议语义走应用层,传输层机制只作锦上添花。
竞态与幂等
重连的经典竞态在「订阅」与「回放」之间:必须先订阅、再回放,且两步在同一同步 tick 内完成,否则「订阅时刻恰好有一事件入库」会丢或重(JS 单线程保证两步之间插不进任何 append)。另外重连导致的事件重放是重复投递——前端必须按 seq/callId 幂等处理、done 要有状态守卫,这正是第 17 章reducer 的功课。
小结
重连是断线恢复的客户端动作、进度指针的消费方:什么时候重连由产品策略决定,重连后从哪续读由 seq 决定,两者结合让「连接断了」从事故变成常态路径。