背压与流量控制让生产速率服从系统承载能力
说明需求信号、有界队列、并发限制和跨边界压力传播,并用过载与恢复测试验证系统稳定性。
背压与流量控制让生产速率服从系统承载能力
当生产者持续快于消费者时,队列会增长,内存和连接被占满,延迟逐步放大,最终以超时、重试和级联故障结束。背压让下游向上游表达可接收的数量或速率,流量控制则把这种能力落实为配额、窗口、队列边界和拒绝策略。它们的目标是保持系统在容量范围内运行,而不是保证所有请求无限等待后都成功。
设计背压要确定信号沿调用链能否传播。如果中间组件只缓存而不反馈,压力只是从一个位置搬到另一个位置;如果入口不能降速,就必须明确丢弃、采样、降级或拒绝哪些工作。
需求信号控制异步元素传输
Reactive Streams 为异步流定义了非阻塞背压语义,下游通过请求数量控制上游可以发送的元素数:https://www.reactive-streams.org/ 。需求额度不是缓存大小,也不是线程阻塞许可。生产者只能在收到正需求后发送,订阅取消后应停止工作并释放资源。
按元素计数适合大小相近的记录;消息尺寸差异很大时,还需按字节、处理成本或并发工作量限制。一次请求过多会让下游积压,逐个请求又可能增加交互和调度开销,通常采用有限批次并在消费后补充额度。
异步边界的实现要处理取消、错误、重复信号和竞态。背压协议保证的是信号规则,不会自动提供持久化、事务或恰好一次处理。消息代理、网络协议和进程内流库各自有不同的确认与重投语义,需要分别设计。
有界队列把过载显性化
无界队列在短时突发下看似提高成功率,却把过载转换成长尾延迟和内存风险。队列容量应由允许等待时间、服务速率和业务截止期限推导。请求在轮到执行前已超过截止期限时,继续排队只会浪费资源。
队列满后可以拒绝新任务、丢弃最旧低价值任务、合并重复更新或降低采样率。策略必须按业务语义选择:支付命令不能静默丢弃,遥测样本可能允许按窗口聚合,缓存刷新可用最新任务覆盖旧任务。所有丢弃和合并都要有指标与审计。
HTTP 语义允许服务用状态码表达暂时无法处理,并可通过 Retry-After 提示重试时机。RFC 9110 是 HTTP 语义的规范来源:https://www.rfc-editor.org/rfc/rfc9110.html 。客户端应采用抖动退避和重试预算,若所有客户端立即重试,拒绝会转化为新的突发流量。
并发限制保护最稀缺资源
系统容量常由数据库连接、外部 API 配额、CPU、内存或设备通道中的一个限制。入口并发上限应围绕该瓶颈设置,而非只按工作线程数。信号量、连接池、令牌桶和自适应并发控制可以把排队位置前移,防止大量工作占住中间资源后才阻塞。
固定阈值容易在负载和依赖延迟变化时失效。自适应方法可根据排队时间、尾延迟和错误率缓慢调节并发,但控制环要避免震荡。突发容量、稳态容量和恢复速度应分别测试,不能用一次峰值压测得出的吞吐当作长期安全上限。
批处理能摊薄固定成本,但批次越大,单条等待越久,失败重试的影响范围也越大。动态批处理要设置最大数量和最大等待时间,并在取消或截止时及时结束。
压力必须跨边界传播
一条请求可能经过网关、应用、消息代理、消费者和数据库。若应用从代理无限预取,代理的背压就无法保护应用;若消费者暂停但生产者仍写入,压力最终表现为代理磁盘增长。每个边界都要记录容量、在途数量、确认方式和满载行为。
同步 RPC 可通过拒绝、超时和并发限制反馈压力,异步消息则通过消费额度、分区处理速率和积压监控体现。对无法控制的外部生产者,入口必须执行配额和负载削减。对关键与非关键流量,应建立独立队列或容量池,避免低价值任务占满所有资源。
背压不能替代容量规划。长期输入速率高于长期服务速率时,任何有限队列最终都会满。需要增加消费能力、减少工作量、改变产品承诺或限制入口,不能只调大缓存。
验证关注稳定性和恢复过程
负载测试应包含平稳负载、短时突发、依赖变慢、消费者停顿和恢复。观察吞吐之外,还要记录队列长度、在途数量、等待时间、拒绝率、重试量、内存和恢复到稳态所需时间。系统在过载结束后仍长时间处理过期任务,说明控制策略不足。
故障演练要验证取消能否释放资源、客户端是否遵守退避、消息是否出现重复处理,以及关键流量能否保持容量。告警应围绕队列增长速率和剩余缓冲时间,而不只在队列已满时触发。
有效背压使过载行为可预测:工作在有界范围内等待,超出范围的请求按明确规则被拒绝或降级,恢复后系统不会被重试洪峰再次压垮。只要其中任一边界仍允许无限积压,整个调用链就没有真正建立流量控制。
资料依据
- Reactive Streams Initiative:Reactive Streams Specification,https://www.reactive-streams.org/
- IETF:HTTP Semantics, RFC 9110,https://www.rfc-editor.org/rfc/rfc9110.html