gRPC 有四种典型通信形态。你可以把它们想成城市专线里的四种车道设计。
#1. Unary —— 单次往返窗口
最普通的一种:发一次请求,回一次响应。
税务局系统 ──请求──> 调度中心
税务局系统 <─响应── 调度中心rpc GetRoute(RouteRequest) returns (RouteReply);适合:
- 查详情
- 创建记录
- 单次计算
- 权限校验
- 配置获取
这类最接近“普通函数调用”。
#2. Server Streaming —— 服务器持续下发窗口
客户端发一次请求,服务端持续推一串消息回来。
监控大屏 ──订阅 ring-1 路况──> 调度中心
监控大屏 <── 路况1 ───────────
监控大屏 <── 路况2 ───────────
监控大屏 <── 路况3 ───────────rpc WatchRoad(RoadWatchRequest) returns (stream RoadEvent);适合:
- 实时通知
- 路况、行情、日志、指标推送
- 大结果集渐进返回
- LLM/推理结果分段回传
关键心智:
请求只发一次,后面重点不是“再请求”,而是“持续读流”。
#3. Client Streaming —— 客户端持续上报窗口
客户端不断发消息,服务端最后汇总回一条响应。
各路摄像头 ──帧1──>
各路摄像头 ──帧2──> 调度中心
各路摄像头 ──帧3──>
各路摄像头 <─汇总结果──rpc UploadSensors(stream SensorFrame) returns (UploadSummary);适合:
- 批量上传
- 日志/埋点收集
- 分块传输大文件
- 设备持续上报后统一确认
关键心智:
不是“发数组”,而是“边产生边送”,最后再统一结算。
#4. Bidirectional Streaming —— 双向对讲窗口
双方都可以持续发消息,彼此独立,像专线对讲机。
隧道控制台 <====== 双向专线 ======> 调度中心
发指令 发确认
发状态 发新策略
发报警 发回退命令rpc ControlTunnel(stream ControlFrame) returns (stream ControlFrame);适合:
- 实时协同
- 聊天式控制流
- 网关与中心双向通信
- 设备控制与状态回传
- 低延迟交互式系统
这里最容易误解的一点是:
双向流不是“先客户端流,再服务端流”,而是两边各自都有独立流,可以边收边发。