系统架构设计师 · 高频练习

消费者处理不过来时,为什么不能让生产者无限写入队列?

高级 单选题 第 923 题 中等 系统架构设计师背压流式系统有界队列过载保护
题目

流式处理系统中,生产者持续每秒产生 10 万条消息,消费者只能稳定处理 6 万条。若不希望队列无限增长并最终耗尽内存,较合理的机制是()。

A 隐藏消费延迟指标,避免触发告警
B 取消队列容量上限,让所有消息永远驻留内存
C 引入背压,让下游容量不足时向上游反馈并限制生产或拉取速率
D 让生产者无条件重试且不设置任何退避
题目类型:原创高频练习题 用途:用于帮助理解系统架构设计师相关考点和答案解析,不等同于官方真题。
正确答案
C
答案解析

当长期输入速率大于处理速率时,积压必然持续增长。背压把下游容量信号传给上游,通过限速、暂停读取、有界缓冲或拒绝策略控制负载,避免系统在无界堆积中失稳。

选项分析

A

错误。隐藏指标不会提高吞吐,反而延误处置。

B

错误。物理内存和可接受延迟都有上限,无界队列只是推迟故障。

C

正确。反馈下游容量并限制上游,是防止无界积压的核心。

D

错误。无退避重试会进一步放大负载,形成重试风暴。

本题为什么容易错

消息队列常被宣传为削峰,于是容易误以为队列越大越安全。削峰针对短时不均衡;平均输入长期高于平均处理能力时,数学上必然越积越多。

先看结论

简短答案

消费者处理不过来时,为什么不能让生产者无限写入队列,正确答案是 C(引入背压,让下游容量不足时向上游反馈并限制生产或拉取速率)。当长期输入速率大于处理速率时,积压必然持续增长。背压把下游容量信号传给上游,通过限速、暂停读取、有界缓冲或拒绝策略控制负载,避免系统在无界堆积中失稳。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
隐藏消费延迟指标,避免触发告警 本题干扰项 错误。隐藏指标不会提高吞吐,反而延误处置。 看到该词不要急着选,先判断是否真正解决题干问题
取消队列容量上限,让所有消息永远驻留内存 本题干扰项 错误。物理内存和可接受延迟都有上限,无界队列只是推迟故障。 看到该词不要急着选,先判断是否真正解决题干问题
引入背压,让下游容量不足时向上游反馈并限制生产或拉取速率 本题正确答案 正确。反馈下游容量并限制上游,是防止无界积压的核心。 看到题干核心场景时优先联想到它
让生产者无条件重试且不设置任何退避 本题干扰项 错误。无退避重试会进一步放大负载,形成重试风暴。 看到该词不要急着选,先判断是否真正解决题干问题
本题易混淆选项怎么区分
  • 隐藏消费延迟指标,避免触发告警:错误。隐藏指标不会提高吞吐,反而延误处置。
  • 取消队列容量上限,让所有消息永远驻留内存:错误。物理内存和可接受延迟都有上限,无界队列只是推迟故障。
  • 让生产者无条件重试且不设置任何退避:错误。无退避重试会进一步放大负载,形成重试风暴。
复习

知识点详解

背压实现可以是消费者显式请求数量、消息系统暂停分区拉取、网络窗口缩小,或有界队列触发阻塞与拒绝。它不能替代容量建设,但能把过载控制在可见边界内。设计时还要明确超时、优先级、丢弃语义、重放能力和恢复速度。监控应同时观察积压数量、最老消息年龄和处理吞吐趋势。

备考速记

短峰靠缓冲,长期差额必须反馈、限速或扩容。

过载保护在过载保护场景中的作用

过载保护在本题中的核心价值,是解决“流式处理系统中,生产者持续每秒产生 10 万条消息,消费者只能稳定处理 6 万条。若不希望队列无限增长并最终耗尽内存,较合理的机制是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。

拓展

同类题怎么考

  • 生产者快、消费者慢导致队列持续增长。
  • 判断有界缓冲、流控窗口和响应式流需求信号的共同思想。
过载保护在系统架构设计师软考中的考法

软考选择题通常不会只考概念定义,还会把过载保护放到过载保护场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。

解题思路

先算一笔最简单的账:每秒多进 4 万条,队列再大也只是晚一点装满。无限缓冲把“现在处理不过来”变成“稍后内存崩溃、延迟几小时”。背压的思路是让下游敢于说慢一点:暂停上游拉取、降低发送速率,或者在有界队列满时明确拒绝。然后团队再决定扩消费者、降采样还是降级。

考点定位

缓冲只能吸收短时波峰,不能解决长期吞吐缺口。背压是反馈机制,还应配合扩容、降级、丢弃策略和容量规划。

易错提醒

  • 只看队列条数,不看最老消息年龄和端到端延迟。
  • 触发背压后没有定义哪些请求可拒绝、可降级或可丢弃。
  • 下游恢复时瞬间放开全部流量,造成二次冲击。

备考提示

  • 容量题先比较长期平均输入与处理速率,再讨论缓冲。
  • 把背压、限流、熔断和负载削峰按反馈方向和触发原因区分。

你可能还想了解

  • 背压和限流有什么区别?
  • 消息队列为什么不能解决长期吞吐不足?
  • 有界队列满了应该阻塞还是丢弃?

本文小结

输入长期每秒多4万条时,任何有限队列最终都会装满。背压把下游容量不足反馈给上游,通过限速、暂停拉取或有界拒绝控制负载,再结合扩容和降级处理根因。