想象你是一家餐厅的店长。后厨的厨师们一刻不停地炒菜(生产者),出餐口是厨房与餐桌之间的连接处(消息队列),传菜员则负责把做好的菜端上桌(消费者)。好店长不会等顾客拍桌子投诉才行动,而是站在出餐口旁边:数一数厨师出了几道菜、传菜员端走了几道菜、出餐口还堆着几道菜。堆得多了,马上喊人;端菜变慢了,立刻查原因;菜做坏了,记下来重新做。这套“眼力”和“手法”,放到软件世界里,就是消息队列的监控与排障。 这篇教程会沿用这家餐厅的视角,讲清楚三件事:怎么盯(监控指标体系)、怎么查(积压与延迟排障)、怎么救(丢失恢复、告警与自愈),最后还会聊一聊这套体系如何根据团队规模渐进式落地。
掌握这套监控排障方法论,你将从“消息队列又出问题了”的被动救火,升级为“指标在手、根因可查、故障自愈”的稳定性工程师——这是中大型系统架构师与 SRE 的核心竞争力。
目录
可视化演示
演示消息积压、延迟与丢失三大问题的监控与排障,依次排查积压、延迟、丢失三类告警,展示队列健康度与告警数量并恢复健康状态。
本节配有交互动效(进入视口后自动加载,约 3KB)。
消息队列排障 积压 延迟 丢失 监控告警自愈恢复健康
1. 监控指标体系|先给后厨装一双眼睛
好店长站在出餐口,心里永远有一本活账:这一小时厨师出了多少道菜,传菜员端走了多少道,出餐口此刻还压着多少道。账目清楚,才知道是“菜出得太快”还是“人端得太慢”。如果连账都没有,出了问题就只能靠顾客拍桌子,那是消防员,不是店长。
消息队列的运维也一样。你需要给系统装上一双“眼睛”——一套监控指标体系,核心就三个数:生产速率、消费速率、积压量。生产速率是厨师出菜的速度,消费速率是传菜员端菜的速度,积压量是出餐口堆着的菜。有了这三个数,系统是否健康一眼便知。
具体到指标层面,还要拆得更细:生产端 TPS、消费端 TPS、队列深度、消费者落后量(consumer lag)、端到端延迟、重试率与死信量。采集方式是在生产和消费的 SDK 里埋点,按固定周期上报到监控系统(如 Prometheus),再由 Grafana 看板可视化。阈值的设定不能拍脑袋:取历史数据的分位数(如 P95 的 1.5 倍)作为动态基线,比固定写死一个“50 条”可靠得多,毕竟不同业务的队列流量可能相差百倍。
有了这双眼睛,店长才能判断“出餐口堆到多少该喊人”。但眼睛只能看到“堆了”,回答不了“为什么堆、多久能清完”,这就进入了下一节——积压分析。
- P(t) 累计生产量从统计开始到时刻 t,生产端成功投递进队列的消息总数。就像厨师从开门到现在做出来的菜的总盘数。
- C(t) 累计消费量同一时间段内,消费者成功处理并提交位点的消息总数。就像传菜员从开门到现在端上桌的菜的总盘数。
- L(t) 净积压量两者相减得到“做了但还没端走”的菜,即实时积压。注意必须用累计值相减,而不是用瞬时速率,否则看不出历史欠账。
2. 消息积压分析|出餐口堆满了,多久能清完
出餐口堆了 100 道菜,厨师还在以每秒 8 道的速度出新菜,传菜员每秒端走 10 道。聪明的店长不会干着急,而是心算:每秒净清掉 2 道,50 秒清完;如果传菜员每秒只端走 6 道,那就永远清不完,必须立刻调整人手。积压是算术题,不是玄学。
消息积压的数学本质与这完全一致。积压量 Q 是被“生产速率 λ 大于消费速率 μ”的差值一点一点累积出来的。分析积压,先要分清类型:是生产突增(大促秒杀、上游故障重放),还是消费变慢(下游数据库慢查询、消费者线程卡死)。两类问题的处置方向完全不同,前者可能要限流,后者要扩容或修下游。
排查路径可以按三步走:第一步看积压曲线的趋势,是持续增长还是高位持平,判断事态是否还在恶化;第二步看消费端日志,查下游依赖的耗时表现,数据库慢查询、外部 API 超时、连接池耗尽都是常见元凶;第三步核对生产端,确认是否预期流量、是否有失败重试在放大请求量。处置手段包括:扩容消费者(注意上限是分区数)、对生产者限流、提高消费并发度、必要时对非关键消息做降级跳过。
算清了“多久能清完”,店长还要回答另一个问题:菜从做好到上桌,为什么忽快忽慢?这就引出延迟的排查。
- Q 当前积压量出餐口此刻堆着的菜盘数,也就是上一节算出的 L(t)。
- μ 消费速率消费者每秒处理并提交的消息条数,相当于传菜员每秒端走的盘数。
- λ 生产速率生产者每秒投递的消息条数,相当于厨师每秒新出锅的盘数。
- μ-λ 净清理速度每秒端走与新增的差值。只有端得比做得快(μ>λ)时差值为正,积压才会减少。
- T 清空时间存量除以净清理速度。若 μ≤λ,分母为负或零,积压永远清不完,必须触发告警。
3. 延迟抖动排查|一道菜为什么忽快忽慢
顾客不关心后厨内部怎么忙,只关心菜什么时候上桌。有时候后厨明明很空,顾客却觉得上菜慢——因为慢可能发生在任何一个环节:备料慢、排队慢、传菜慢。店长若只盯着灶台的火力,永远找不到答案。
消息队列的端到端延迟同理,由三段构成:生产耗时 T_p、排队耗时 T_q、消费耗时 T_c。很多团队一看到延迟升高就查网络,这是最容易踩的坑。延迟高,很多时候是积压导致的排队等待——菜在出餐口堆着,自然上得慢。延迟是积压的症状,积压是延迟的病因之一,两者要放在一起看。
排查抖动要靠“分段打点”:在生产者发送时、消息进入队列时、消费者拉取时分别记录时间戳,两两相减就知道每段耗时。常见抖动源有:生产者批量凑批(攒一批才发,延迟被刻意拉高)、JVM GC 长暂停、网络重传、broker 刷盘与主从复制、消费者偶发的慢调用。优化手段包括:调整批量发送的超时上限、消除 GC 长暂停、采用更优的刷盘策略、给消费逻辑加超时与熔断。
把延迟拆成三段,就像店长分别在备料台、出餐口、传菜路上掐表。哪一段慢,就找哪一段的麻烦。
- T_p 生产耗时生产者从发起发送到消息真正进入队列的时间,含序列化、网络发送、broker 写入。相当于厨师把菜做完放到出餐口的时间。
- T_q 排队耗时消息在队列中等待被消费的时间,与积压量正相关。相当于菜在出餐口排队等传菜员的时间。
- T_c 消费耗时消费者拉取消息后执行业务逻辑并提交位点的时间。相当于传菜员从端起菜到放到顾客桌面的时间。
- T 端到端延迟三段相加才是用户感知的总延迟。排查抖动必须分段打点,才能定位是哪一段在“拖延”。
4. 消息丢失防护|好好一盘菜怎么就不见了
后厨最怕的事,是顾客的菜“凭空消失”:厨师说做了,传菜员说没见到;明明是 A 桌的菜,结果端给了 B 桌。顾客不关心过程的口径,只认一个结果——菜没上齐。对餐厅来说,这比上菜慢更伤信誉。
消息丢失可能发生在三个环节,对应三个“看不见的坑”:生产端发送后 broker 未落盘,断电即丢;存储端副本未同步,主节点切换时丢数据;消费端 offset 提前提交,消费者崩溃后消息被跳过。任何一个环节没守住,消息就会“凭空消失”。所以排查丢失,第一步永远是确认丢在哪一段——根据丢失发生的位置去翻对应的日志和指标。
防线分三层。第一层,生产者发送确认(ACK)与同步发送,确保消息进入 broker 才返回成功,相当于“厨师确认菜放上了出餐口”;第二层,服务端同步刷盘与多副本同步,防止掉电和节点故障丢数据,相当于“出餐口有监控录像”;第三层,消费者手动提交 offset,业务处理成功后再提交位点,失败则重试,相当于“端到桌上才划单”。重试必须有上限(如 3 次加指数退避),耗尽后进入死信队列,由补偿任务处理。还要定期跑“对账”:对比生产总数与消费成功总数,差值超过阈值就触发追查。
死信队列就是后厨的垃圾桶:做坏的菜先扔进去记好账,稍后统一重做(补偿);周期对账就是每晚盘点库存,发现少了几道菜,立刻翻后厨录像追查。
- S 生产确认总数生产者收到 broker 确认的消息总数,代表“确定做出来了的菜”。
- R 成功消费总数消费者成功处理并提交位点的消息总数,代表“真正端上桌的菜”。
- S-R 丢失缺口两者之差是“无声消失”的消息,可能落在传输、存储或消费任一段。
- η 丢失率缺口占生产总数的比例。对账任务周期计算它,一旦超过阈值就触发追查和补偿。
5. 告警与自愈|店长不能每秒钟都喊一嗓子
如果出餐口多两盘菜店长就大喊一次,传菜员会疯掉;但如果一直不喊,顾客会疯掉。告警的精髓是有“度”:既不错过真问题,也不制造噪音。好店长喊一嗓子,全后厨都会当真;坏店长天天喊,喊破喉咙也没人理。
原始监控指标天然带毛刺:一次 GC 暂停、一次网络重传、一个批量窗口,都会让积压量瞬间跳高。直接拿原始值设阈值,会引发“告警风暴”,值班群被刷屏,真故障反而被淹没。解法是用指数移动平均(EMA)把毛刺磨平,只看趋势;同时做分级告警:P1(红色)积压持续增长需立即处置,P2(黄色)延迟升高需关注,P3(蓝色)信息通报即可。
告警之后的下一步是自愈:积压超阈值自动扩容消费者(扩容前校验分区上限)、失败消息自动重试、异常节点自动摘除并重路由。但自愈不是“上线就不管了”,配套要有故障演练和复盘:定期注入积压、断网、节点宕机等故障,验证告警链路和自愈动作是否真的有效,行情一过就复盘告警质量,砍掉失效规则。
EMA 之于告警,就像店长的“火候判断”——不盯每一盘的瞬时状态,而是感知趋势。趋势不对才出手,出手就要有效。
- x_t 当前采样值这一秒的原始监控值,比如瞬时积压量,可能带毛刺。
- E_{t-1} 上一时刻平滑值前一个时刻已经平滑过的值,相当于店长对“上一眼”的印象。
- α 平滑系数0<α<1 的权重。α 越大越相信最新数据,越灵敏也越容易抖;α 越小越平滑但越迟钝,实践中常取 0.1~0.3。
- E_t 平滑结果新旧信息按权重相加,把瞬间毛刺“磨平”,只有持续的趋势才会触发告警。
6. 渐进式落地|小馆子不必上满汉全席的班子
路边小馆子的老板,眼睛一抬就能看到整个后厨;连锁餐厅需要值班经理看监控屏;五星级酒店需要一整套厨房管理系统。监控体系也一样,要和团队规模、业务复杂度匹配。一步到位上全套,往往死于维护成本——告警没人看、看板没人会读、自愈脚本没人敢碰。
小团队(几个微服务)最务实的做法,是只盯三个核心指标:生产速率、消费速率、积压量,配一块 Grafana 看板和一条积压告警,就能覆盖 80% 的痛点。中型团队再增加消费速率基线与容量评估、分级告警、死信队列与对账任务。大型或核心业务团队,才需要全链路延迟打点、自动扩容自愈、故障演练与复盘,形成“眼睛—嘴巴—手—大脑”的完整闭环。
演进路径要循序渐进:先有眼睛(监控)→ 再有嘴巴(告警)→ 再有手(自愈)→ 最后有大脑(容量规划与全链路分析)。每走一步都要算成本:指标降采样与控制存储成本、告警收敛避免疲劳、自愈动作设开关与回滚。而到了“大脑”阶段,你就必须会做容量规划——算出高峰时需要多少个消费者实例。
从盯一盘菜到管整个连锁后厨,靠的不是一口气买齐设备,而是每一步都站在前一步的地基上。先把“眼睛”装好,再长出“手”,最后才有“大脑”。
- λ 峰值生产速率业务高峰时每秒钟进入队列的消息数,是容量规划的上限输入。
- μ_c 单实例消费速率一个消费者实例实测每秒能处理的消息数,来自压测或历史峰值统计。
- ⌈·⌉ 向上取整相除结果不是整数就向上取整,保证实例数只多不少,留出余量。
- N 所需实例数理论最少消费者数。它还有硬约束——不能超过队列分区总数,否则多出的实例空闲。
AI 应用场景
1. 大促前容量评估与积压演练
阶段:容量评估与压测阶段
解决的问题:传统方式是凭经验拍脑袋定消费者数量,大促流量一来积压飙升,运营损失惨重。用正文的容量公式先算出 N,再结合积压清空时间公式设定预案阈值,用故障注入演练验证告警与处置链路是否真的有效。
具体案例:某电商平台在 618 前对订单消息做全链路压测,实测单实例消费速率后按峰值流量把消费者从 20 个扩到 60 个,并把 P1 告警阈值调到积压 5 分钟可清空的水位。大促当天积压峰值仅为容量的 40%,全程零告警误报。
2. 支付对账系统的消息丢失检测与补偿
阶段:数据对账与恢复阶段
解决的问题:传统方式靠用户投诉才发现“支付成功但积分没到账”。用正文的丢失率公式做周期对账,生产确认总数 S 与消费成功总数 R 的差值一旦超阈值立即追查;重试耗尽的消息进死信队列,由补偿任务自动重放,确保“菜必须上桌”。
具体案例:某支付平台每 5 分钟跑一次对账,曾发现 0.03% 的丢失率,定位到消费端提前提交 offset:消费者在业务处理前就提交了位点,进程重启时消息被跳过。切换为手动提交并加补偿任务后,丢失率归零。
3. 告警风暴治理与自动扩容
阶段:异常检测与自愈阶段
解决的问题:传统方式下值班群被毛刺触发的告警刷屏,真故障被淹没,人工登录服务器扩容需要 20 分钟。用 EMA 平滑毛刺、分级告警收敛噪音;积压持续超阈值时,由自动化平台直接扩容消费者实例(扩容前自动校验分区上限),实现故障自愈。
具体案例:某团队接入自愈平台后,告警量下降了 70%,平均故障处理时间从 25 分钟降到 3 分钟。一次下游数据库慢查询引发的积压,在 1 分钟内被自动扩容动作消化,业务无感知。
Python 演示
# -*- coding: utf-8 -*-"""消息队列监控排障模拟器模拟生产-消费过程,监控积压与丢失率,积压超阈值时自动扩容消费者实例(自愈)。"""import randomimport time class MQSimulator: """简易消息队列监控对象:生产、消费、死信、积压与自愈""" def __init__(self, alert_threshold=10): self.produced = 0 # 累计生产消息数 self.consumed = 0 # 累计成功消费消息数 self.dlq = 0 # 死信队列消息数(等价丢失) self.alert_threshold = alert_threshold self.cons_rate = 1 # 消费者处理能力(条/步) self.scaled = False # 是否已扩容 @property def lag(self): """主队列积压 = 生产数 - 成功消费数 - 死信数""" return self.produced - self.consumed - self.dlq @property def loss_rate(self): """消息丢失率 = 死信数 / 生产数""" if self.produced == 0: return 0.0 return self.dlq / self.produced def step(self): """推进一个时间步:生产者投递、消费者拉取""" # 生产者每步投递 2~3 条消息 self.produced += random.randint(2, 3) # 消费者最多拉取当前积压量 batch = min(self.cons_rate, self.lag) for _ in range(batch): if random.random() < 0.02: # 2% 概率处理失败 self.dlq += 1 # 重试耗尽进死信队列 else: self.consumed += 1 # 成功处理并提交位点 def monitor_and_heal(self): """监控与自愈:积压超阈值则扩容,回落后缩容""" if self.lag > self.alert_threshold and not self.scaled: self.cons_rate *= 3 self.scaled = True print('[告警] 积压 {} 条超阈值,扩容至 {} 条/步'.format(self.lag, self.cons_rate)) elif self.lag <= self.alert_threshold * 0.5 and self.scaled: self.cons_rate = max(1, self.cons_rate // 3) self.scaled = False print('[恢复] 积压回落至 {} 条,缩容至 {} 条/步'.format(self.lag, self.cons_rate)) def run(self, steps=30, interval=0.1): """持续运行:每个时间步执行一次监控与打印""" for t in range(steps): self.step() self.monitor_and_heal() print('t={:>2} 生产={:>3} 成功={:>3} 死信={:>2} 积压={:>2} 丢失率={:.1%}'.format( t, self.produced, self.consumed, self.dlq, self.lag, self.loss_rate)) time.sleep(interval) if __name__ == '__main__': sim = MQSimulator(alert_threshold=10) sim.run(steps=30)
self.produced += random.randint(2, 3)模拟生产者每步投递 2~3 条消息,对应厨师不停出菜。return self.produced - self.consumed - self.dlq积压的核心公式 L=P-C-D,与正文的监控指标一脉相承。batch = min(self.cons_rate, self.lag)消费者最多拉取当前积压量,防止“消费”超过“生产”出现负数。if random.random() < 0.02:2% 概率处理失败,模拟真实系统中的偶发性消费失败。self.dlq += 1失败重试耗尽进入死信队列,对应“做坏的菜扔进垃圾桶”。if self.lag > self.alert_threshold and not self.scaled:积压超阈值触发告警,这是自愈动作的起点。self.cons_rate *= 3自动扩容消费者实例,对应店长高峰期呼叫临时工。print('t={:>2} ...')持续输出监控指标,就像盯住出餐口的那双眼睛。
常见误区
误区队列积压了?直接把消费者实例从 5 个加到 50 个,人多力量大,肯定能清完。
正解每个分区在同一消费组内同一时刻只能被一个消费者实例消费。消费者实例数超过分区数后,多出来的实例只能“看着”不能“吃”。加人之前必须先确认两件事:一是分区数上限,二是瓶颈是否在下游。如果瓶颈是数据库慢查询,加再多消费者也卡在同一道闸机前,反而加重下游压力。
为何常见:直觉上“人手不够就加人”在餐厅里成立,但忽略了消息队列基于分区的并发模型,也容易用“加机器”掩盖真实瓶颈。
误区端到端延迟升高了,先查网络,肯定是交换机丢包或者带宽不够,让网络组去排查。
正解端到端延迟 = 生产耗时 + 排队耗时 + 消费耗时。很多“延迟高”其实是积压导致的排队等待——消费者处理变慢,菜在出餐口堆着,上桌自然慢;也有可能是生产者批量凑批、JVM GC 暂停、broker 刷盘造成的。不分段打点就查网络,常常白忙一场,还延误了真正的故障处理。
为何常见:网络对大多数工程师是“黑盒”,看不见摸不着,习惯性先甩锅给它,而自己的代码链路反倒更容易先背锅。
误区broker 都开了 ACK 确认,消息不可能丢,不用再做对账,省点功夫。
正解生产端 ACK 只保证“生产者→broker”这一段。消息丢失还可能发生在存储端(异步刷盘掉电丢数据、主从切换未同步)和消费端(offset 提前提交,消费者崩溃后消息被跳过)。正确做法是三层防线:生产确认 + 同步刷盘/多副本 + 手动提交 offset,再加周期对账兜底,才能把丢失率压到业务可接受的范围。
为何常见:把“发送确认”误当成“全程保障”,忽略了消息生命周期里还有存储和消费两个大环节。
误区积压超过 5 条就告警,阈值越低越灵敏,越能早发现问题,宁可错杀不可放过。
正解监控指标天然带毛刺,批量处理、GC 暂停、网络瞬时抖动都会让积压瞬间跳高。阈值过低会触发海量告警,值班人员麻木后反而漏掉真故障。正确做法:EMA 平滑看趋势、阈值按历史分位数设定、告警分级(P1/P2/P3),让每一条告警都“值得响”。
为何常见:“灵敏度越高越好”是出于安全的本能直觉,但告警系统是给人用的,误报过多会摧毁整个系统的可信度。
误区消费失败了就重试,一直重到成功为止,反正消息在队列里不会丢,总能处理掉。
正解无限重试带来两个灾难:消息永远不提交位点,积压持续增长;重试风暴会把下游依赖打垮,本来只坏一个服务,最后拖垮一片。正确姿势是有限次重试加退避间隔(如 3 次指数退避),重试耗尽后进入死信队列,由对账或补偿任务处理。
为何常见:直觉上“失败就再试”没问题,但忽略了重试是有成本和连锁反应的,重试必须配上界和退避。
面试题
Q1. 关于消费者落后量(积压)的计算,下列正确的是?
- A.生产总数减去消费总数← 正确答案
- B.消费总数减去生产总数
- C.队列占用磁盘空间的字节
- D.生产速率除以消费速率之值
答案:A。消费落后量定义为生产端累计投递数减去消费端累计处理数,反映“做了但还没端走的菜”。B 方向反了,C 是存储占用而不是消息条数,D 是速率比值而非存量差值。
Q2. 积压量 Q、生产速率 λ、消费速率 μ 时,清空积压大约需要多久?
- A.积压量除以生产速率的商
- B.积压量除以消费速率的商
- C.积压量除以生产消费速率差← 正确答案
- D.积压量与速率差相乘之积
答案:C。清空积压要把存量 Q 除以净清空速度 μ-λ,即消费速率减去生产速率。A、B 只考虑了单端速率,忽略了还有新消息持续涌入;D 方向错误。若 μ≤λ,积压只会越堆越多。
Q3. 一个消息队列分区在同一消费组内同时能被几个消费者实例消费?
- A.只能被一个消费者实例← 正确答案
- B.可以被两个实例同时
- C.消费者数量不受限制
- D.与分区数量没有关联
答案:A。同一个分区的消息在同一消费组内只能被一个消费者实例消费,这是分区并发模型的基本约束。B、C 违背该约束,D 说与分区无关也错。因此消费者实例数超过分区数时,多出的实例只能空闲。
Q4. 下列哪项最可能导致消费变慢并产生积压?
- A.下游数据库出现了慢查询← 正确答案
- B.生产者启用了异步发送
- C.消息体被压缩后存储
- D.消费者关闭了日志输出
答案:A。消费者变慢最常见的原因是下游依赖退化,数据库慢查询会阻塞消费线程。异步发送、压缩存储、关闭日志都不会让消费变慢,反而可能是性能优化手段。
Q5. 降低消息丢失风险的有效手段包括哪些?
- A.生产者开启发送确认机制← 正确答案
- B.消费者手动提交消费位点← 正确答案
- C.服务端采用同步刷盘方式← 正确答案
- D.对失败消息进行无限重试
答案:ABC。生产端 ACK 保证消息进入 broker;手动提交位点保证业务处理成功后才确认;同步刷盘保证掉电不丢。D 的无限重试会导致重试风暴和积压恶化,反而有害。
Q6. 死信队列的主要用途是什么?
- A.存放重试后仍失败的消息← 正确答案
- B.存放所有已经消费过的消息
- C.存放生产者发送的原始消息
- D.存放积压告警的统计记录
答案:A。死信队列专门存放重试多次仍失败的消息,相当于后厨的垃圾桶,等待人工或补偿任务处理。B 是消费全量,C 是原始消息,D 是监控统计,都不是死信队列的职责。
Q7. 端到端消息延迟通常由哪三段构成?
- A.生产耗时排队耗时消费耗时← 正确答案
- B.网络耗时磁盘耗时线程耗时
- C.序列化反序列化压缩等耗时
- D.抓包分析定位等排查耗时
答案:A。端到端延迟 = 生产耗时 + 排队耗时 + 消费耗时,对应厨师做菜、出餐口排队、传菜上桌。B 是资源层面的耗时,C 只是生产耗时的子集,D 是排障动作而非延迟构成。
Q8. 排查消息积压问题时,合理的操作顺序包括哪些?
- A.先确认积压量及增长趋势← 正确答案
- B.再定位消费端的瓶颈环节← 正确答案
- C.评估生产消费的速率差异← 正确答案
- D.直接重启所有消费者的实例
答案:ABC。排障要先看积压量和趋势确认问题存在,再定位消费端瓶颈,并对比生产消费速率差。D 的无脑重启是应急手段而非排查步骤,还可能造成二次故障。
Q9. 关于消息积压处置的说法,正确的是哪些?
- A.扩容消费者前先确认分区上限← 正确答案
- B.消费瓶颈常在下游依赖环节← 正确答案
- C.积压消息可直接丢弃不补偿
- D.对生产者限流可缓解积压增长← 正确答案
答案:ABD。扩容前确认分区数上限,否则多出的消费者实例空闲;消费瓶颈常在下游依赖,先修下游再加人;对生产者限流能减缓积压增长。C 直接丢弃积压消息会丢数据,必须走补偿流程。
Q10. 积压量 10000 条,生产速率 800 条/秒,要求 20 秒内清空,消费速率至少为多少?
- A.每秒需要消费约 1300 条← 正确答案
- B.每秒需要消费约 1000 条
- C.每秒需要消费约 500 条
- D.每秒需要消费约 800 条
答案:A。20 秒内既要消化存量 10000 条,还要消化 20 秒内新到的 16000 条,共 26000 条,除以 20 秒得 1300 条/秒。B、D 只考虑了存量或增速,C 连存量都清不完。