1. 微服务之间是怎么交互的?
- 同步:使用 OpenFeign。
- 异步:使用 MQ。需要获取返回值时只能用 OpenFeign。
2. 为什么要用 MQ
- 异步:可以提高页面响应速度。
- 流量削峰填谷:应对突发流量。
- 解耦:降低系统间依赖。
3. 详细说一下 MQ 是怎么用的?
- 消息发送:使用 RabbitTemplate 的发送方法,发送到交换机中,再通过路由规则(Key)路由到队列。
- 消息消费:在消费者方法上添加
@RabbitListener注解,指定消费的队列。
4. 消息丢失怎么办?
- 发送方:开启确认机制,设置两个回调方法,分别判断消息是否到达交换机和是否到达队列。
- MQ 本身:交换机、队列、消息都持久化到磁盘上。
- 消费方:开启确认机制,设置重试次数;重试次数到达上限后,把消息转到专门存放错误消息的队列。
5. 消息堆积怎么办?
原因:发送方瞬间并发量大、消费者效率低。 解决方案:
- 多加几个消费者。
- 开启多线程。
- 使用惰性队列(好处是消息直接放到磁盘)。
6. 怎么保证消息的幂等性?
- 方案一(通用):每一条消息生成唯一 ID,随消息投递。消费者处理成功后将 ID 保存到 Redis。若再次收到相同 ID,查询 Redis 判断是否存在,存在则放弃处理。
- 方案二(结合业务):更新时多带一个条件;新增时先查询再新增。
7. 什么是死信?
- 定义:消息超时未被消费的消息成为死信。
- 应用场景:延迟消息。
8. 延迟消息怎么做?
RabbitMQ 提供专门用来做延迟消息的插件。创建交换机时声明为延迟交换机,发送消息时指定延迟时间。
9. 在项目中你们使用的是 MQ 的哪种模式?
- Direct / Topic。
- 消息发送时携带了一个 Key 到了交换机。


