外观
线程池 → Spring 异步 → MQ 消费者 追问链
追问路径
Q: 线程池核心参数怎么配?
→ 核心/最大/队列/拒绝策略
Q: Spring @Async用的什么线程池?
→ 默认SimpleAsyncTaskExecutor(每次new线程!要自定义)
Q: MQ消费者的并发是怎么控制的?
→ concurrency配置本质也是线程池
Q: 消费慢导致消息积压怎么办?
→ 扩消费者+临时增大线程池+降级非核心涉及知识点
- 线程池核心参数与执行流程 — 7大参数与任务执行流
- Spring-@Async原理 — Spring异步执行底层
- 消息积压处理方案 — MQ消费端优化
- 线程池大小如何设定 — CPU密集 vs IO密集
核心串联逻辑
- 线程池本质:复用线程 + 控制并发度 + 任务队列缓冲
- Spring @Async 陷阱:默认不用池,每次 new Thread,必须自定义 ThreadPoolTaskExecutor
- MQ 消费并发:Kafka 由 partition 数决定上限,RocketMQ 由 consumeThreadMin/Max 控制
- 积压应急:横向扩容消费者 + 临时调大线程池 + 跳过非核心消息
面试回答串联
"线程池我会根据 IO/CPU 密集型设定核心线程数。Spring @Async 必须自定义 Executor 避免默认的无限创建。MQ 消费者本质也是线程池消费,积压时先扩 partition 和消费者实例,临时调大消费线程数来快速消化。"