典型症状

  • 单连接吞吐很高,但进程 RSS 持续上涨。
  • p99 抖动明显,GC 时间占比异常。
  • 下游稍慢就触发级联超时。

流控设计要点

  1. 应用层窗口:限制每个 stream 的未确认消息数。
  2. 连接层隔离:大流量 stream 与普通 RPC 分离连接。
  3. 消费层背压:处理队列满时暂停读或降级。

服务端模式

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 的本质是长期会话。想要稳,必须让发送速率服从消费能力,而不是盲目追求“尽快塞满管道”。