WebSocket、SSE 与 gRPC 实战验收

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

三者解决不同问题,不能简单按“哪个更快”替换。HTTP 是 Hypertext Transfer Protocol(超文本传输协议)。

机制 适用场景 主要约束
WebSocket 浏览器与服务端双向消息 长连接、心跳、鉴权、流控、重连;经典 HTTP/1.1 握手返回 101
SSE(Server-Sent Events,服务端发送事件) 服务端向浏览器持续推送文本 text/event-stream;浏览器 EventSource 支持重连,服务端须支持游标恢复
gRPC(gRPC Remote Procedure Calls,远程过程调用框架) 有明确契约的服务间调用/流 常用 HTTP/2 + Protocol Buffers;浏览器通常需 gRPC-Web 等适配

HTTP 200 不代表 gRPC 成功,需检查最终 grpc-status;SSE/WebSocket 连上也不代表消息不会丢或重复。

1. Hands-on A:WebSocket 握手和真实消息#

前提:已有预发布 WebSocket 服务和测试账号,明确订阅/发送协议。可用仓库 Centrifugo 实战 部署真实消息系统;不要向未知协议端点随便发送 JSON。

在该应用页面 Console 中,使用实际允许的测试地址:

var wsProbe = new WebSocket('wss://realtime.staging.example.com/connection/websocket');
wsProbe.onopen = () => console.log('transport open');
wsProbe.onmessage = event => console.log('message received, bytes=', event.data.length);
wsProbe.onerror = () => console.log('transport error; inspect Network');
wsProbe.onclose = event => console.log('closed', event.code, event.wasClean);

这是传输观察;Centrifugo 等仍需用其正式 SDK(Software Development Kit,软件开发工具包)完成连接认证与频道订阅。浏览器 WebSocket API 不能任意设置 Authorization 头;按系统设计使用安全 Cookie、短期票据或连接后协议认证,避免长效 token 出现在 URL。

  1. Network 查看握手与 Messages;在测试频道由正式发布接口发送带唯一事件 ID 的消息,验证只有授权租户收到。
  2. 开发者工具切换 Offline,再恢复 Online;原生 WebSocket 不会自动重连,检查实际 SDK 的退避与重订阅。
  3. 通过事件 ID 核对丢失/重复、服务端恢复窗口;超出窗口必须全量重同步,不能声称天然 exactly-once。
  4. 执行 wsProbe.close(1000, 'test complete'),清理测试订阅和票据。

若经过 Nginx,其 HTTP/1.1 路径需要显式转发 Upgrade/Connection,并合理设置 idle timeout;配置依据 Nginx WebSocket、WebSocket 标准。不能把普通代理的 Connection "" 原样用于升级路径。

2. Hands-on B:SSE 断线续传#

前提:现有事件接口会发送 id:、data: 和定期心跳,业务存储能按 ID 重放。浏览器同源页面运行:

var sseProbe = new EventSource('/events');
sseProbe.onmessage = event => console.log('event', event.lastEventId);
sseProbe.onerror = () => console.log('state', sseProbe.readyState);

如果服务端发送命名事件,如 event: order.updated,额外注册 addEventListener('order.updated', ...);它不会进入默认 onmessage。

  1. 发布测试事件 A,记录 id;在 Network 确认事件逐条到达。
  2. 临时 Offline,期间发布 B,恢复网络。原对象重连时观察 Last-Event-ID,验证 B 补发及客户端去重。
  3. 原生 EventSource 不支持任意 Authorization 头;跨源 Cookie 模式使用 {withCredentials:true} 并配置正确跨域许可。永久权限失效需业务明确停止重连。
  4. sseProbe.close() 停止;检查连接数回落。新建 EventSource 对象不能自动继承旧对象的内存游标,刷新恢复需应用自己设计。

代理缓冲与心跳验收见 流式传输;协议依据 EventSource 标准。

3. Hands-on C:gRPC 契约、截止时间和状态#

前提:已部署的预发布服务实现标准 gRPC Health 服务,准备 grpcurl、仓库中的 proto 契约、可信 CA(Certificate Authority,证书颁发机构)证书。不是要求在公网开启 reflection(运行时服务描述查询)。

从官方 health.proto 按项目批准的版本保存到本地 proto/grpc/health/v1/health.proto,记录提交版本。然后:

export GRPC_TARGET='grpc.staging.example.com:443'
export GRPC_CA='/替换为/approved-ca.pem'
grpcurl -cacert "$GRPC_CA" -max-time 5 -import-path ./proto -proto grpc/health/v1/health.proto -d '{"service":""}' "$GRPC_TARGET" grpc.health.v1.Health/Check

预期 SERVING 且命令成功。若服务要求客户端证书,增加 -cert、-key 指向权限受控的本地文件;如果未实现 Health 服务,则应使用项目提供的只读 RPC(Remote Procedure Call,远程过程调用)契约,不能把 UNIMPLEMENTED 当网络故障。

在隔离预发布对同一只读调用设置极短 -max-time 0.001,观察超时/取消;极短时间也可能在连接阶段到期,不能单凭它证明应用处理超时。恢复 5 秒后应成功;再用真实慢调用和服务端追踪验证 deadline 传播及取消后资源释放。

业务调用需同时验收权限拒绝、错误状态、流结束状态、消息大小限制、重试幂等与发布排空。工具与语义见 grpcurl、gRPC deadline。

4. 上线验收门槛#

记录连接数、消息延迟、积压、重连率、拒绝率与恢复窗口。测试慢消费者、单实例发布、短时断网和凭证过期;为每项定义允许丢失/重复及重放规则。只连通一次不算企业验收。完成后恢复网络与超时配置,关闭探针、撤销测试身份;本文不向真实频道发布消息。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭