标准答案
- 削峰把短时间突发请求先写入可承载的队列,再按消费者能力平稳处理;前提是业务能接受排队、队列有容量上限并能反馈受理状态。
- 异步适合不必阻塞主请求的任务,例如通知、索引同步、图片处理和统计;主流程仍要决定什么时候向用户承诺成功。
- 解耦让订单服务只发布“订单已支付”等业务事件,由多个订阅者独立消费;事件契约、版本、重放和幂等必须一起设计。
- 若调用必须立刻得到结果、数据量很小、失败处理很简单,直接同步调用或数据库事务往往更清晰,不应为了“微服务化”强行上消息队列。
题目解析
队列不是消除压力,而是把压力变成可观察的积压。消费者吞吐长期小于生产速率时,积压只会增长,最终仍要限流、扩容、降级或减少工作量。
引入队列后,系统从一次调用成功变成多个阶段最终完成。需要能回答消息丢失、重复、乱序、毒性消息和用户查询进度的路径。
常见误区
- 把消息发送成功等同于整个业务已成功完成。
- 没有定义队列满、消费者停滞和重试耗尽时如何通知和补偿。