SSE 协议通过id:字段和Last-Event-ID请求头实现消息续传。服务端为每条消息分配单调递增或全局唯一的ID,客户端重连时自动在请求头中携带最后收到的消息ID,服务端据此查询并补发遗漏的消息。该机制依赖服务端保存最近N条消息的缓冲区或持久化存储(如Redis 、数据库),缓冲区大小需根据业务消息产生速率和可能的断线时长合理设置。
在SSE 协议本身不提供消息确认(ACK)机制的前提下,通过Last-Event-ID续传可实现"至少一次"(At-Least-Once)的消息传递保证:正常情况下每条消息恰好传递一次;网络断开并重连后,可能重复收到断线前的最后几条消息(因客户端最后收到的ID对应的消息可能已被处理,但服务器无法精确感知)。业务层需对消息处理做幂等性设计,确保重复消息不会导致异常状态。
SSE 基于TCP协议传输,TCP本身提供了数据有序、无损坏、无丢失的字节流传输保证。在TCP连接正常的前提下,服务端写入的SSE消息会完整、按序地到达客户端。但需注意:当TCP连接非正常关闭(如进程崩溃、网络中断)时,已在TCP发送缓冲区中但尚未被对端确认的数据会丢失,这部分消息需要通过Last-Event-ID机制补发。
为保证重连期间的消息不丢失,服务端通常需要在内存中维护一个按消息ID排序的缓冲区(如环形缓冲区或链表),保存最近N条消息。缓冲区大小需要在消息可靠性与内存占用之间权衡:过大的缓冲区会增加内存压力,过小的缓冲区可能导致重连时间跨度较大时无法完整补发遗漏消息。在生产环境中,可结合腾讯云Redis等外部存储来持久化消息ID与内容,支持更长时间跨度的重连补发。