标准答案
- 有界队列满时可以快速失败、降级、阻塞生产者或转移到可靠存储,调用方能得到可处理的反馈。
- 无界队列短期内看似不丢任务,但会积累过期工作、占用内存并触发 GC、OOM 和级联超时。
- 队列容量应根据任务大小、处理速率、可接受等待和内存预算设置,而不是随意设置一个很大数字。
- 积压要有告警和清理策略;对过期任务应支持丢弃或降级,不能只等待慢慢消化。
题目解析
队列只能把工作从当前调用转移到未来处理,并不会提升消费者的实际处理速率。无界队列把短暂突发和永久过载混在一起,最后通常表现为内存增长、任务过期和整体超时。
有界队列的容量应由任务大小、消费者速率、可接受等待和内存预算共同决定。队列满之后要明确是阻塞生产者、拒绝、丢弃低价值任务,还是写入可靠消息系统。
监控不能只看队列长度。最老任务年龄、生产/消费速率、积压字节数、内存和过期比例更能判断队列是在吸收正常突发,还是已经失去消化能力。
常见误区
- 误区:把无界队列当作可靠消息系统。改正:需要进程崩溃恢复和持久化时使用可靠存储,并在内存队列上保留有界保护。
- 误区:只监控队列长度。改正:同时监控最老任务年龄、消费速率、积压字节数和过期任务,避免小任务数量掩盖大任务占用。
- 误区:拒绝和丢弃不区分。改正:拒绝应让调用方得到明确反馈,丢弃只能用于有明确业务价值和补偿规则的任务。