典型症状
- 单连接吞吐很高,但进程 RSS 持续上涨。
- p99 抖动明显,GC 时间占比异常。
- 下游稍慢就触发级联超时。
流控设计要点
- 应用层窗口:限制每个 stream 的未确认消息数。
- 连接层隔离:大流量 stream 与普通 RPC 分离连接。
- 消费层背压:处理队列满时暂停读或降级。
服务端模式
type StreamState struct {
inflight int64
limit int64
}
func (s *StreamState) AllowRecv() bool {
return atomic.LoadInt64(&s.inflight) < s.limit
}
参数调优建议
MaxRecvMsgSize不要无限放大,优先拆包。- 对大对象优先走分块传输。
- 结合业务 ACK 做“应用级信用”控制。
观测面
- 每 stream inflight 数。
- 解码耗时与业务处理耗时拆分。
- 内存分配热点(pprof alloc_space)。
小结
Streaming 的本质是长期会话。想要稳,必须让发送速率服从消费能力,而不是盲目追求“尽快塞满管道”。