RabbitMQ
2023/10/10大约 4 分钟
同步调用
异步调用
优势:
- 解除耦合,拓展性强
- 无需等待,性能好
- 故障隔离
- 缓存消息,流量削封填故

缺点
- 时效性低,拿不到结果
- 不确定执行是否成功
- 业务安全依靠Broker
技术选型

认识和安装
RBMQ整体架构概念:
- virtual-host:虚拟主机,起到数据隔离的作用
- publiser:消息发送者
- consumer:消息的消费者
- queue:队列,存储消息
- exchange:交换机,负责路由消息

快速入门
建队列,交换机绑定队列,然后路由发送到队列(队列都收到了)

数据隔离
AMQP
翻译过来就是高级消息队列协议
Spring AMQP
spring-rabbit是底层默认实现
Work模型
- 多个消费者绑定到一个队列,可以加快消息处理的速度
- 同一条消息只会被一个消费者处理
- 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理吓一跳,实现能者多劳
Fanout交换机
真实生产环境都会警告exchange来发送消息,而不是直接发送到队列,交换机的类型有三种
- Fanout:广播
- Direct:定向
- Topic:话题

Fanout Exchange会将接收到的消息广播到每一个跟其绑定的Queue,所以叫广播模式

Direct交换机
- 每一个Queue都与Exchange设置一个BindingKey
- 发布者发送消息时,指定消息的RoutingKey
- Exchange将消息路由到BindingKey与消息RoutingKey一致的队列
Topic交换机
TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以.分割

生产者重连
生产者确认
数据持久化
一般就是消息的持久化
Lazy Queue
惰性队列
- 接收到消息后直接存入磁盘而非内存(内存中只保留最近的消息,默认2048条)
- 消费者要消费消息才会从磁盘中读取并加载到内存
- 支持数百万条的存储
- 在3.12版本后,所有队列都是lazy queue模式,无法更改
消费者确认机制
- ack:成功处理消息,RabbitMQ从队列中删除该消息
- nack:消息处理失败,RabbitMQ需要再次投递消息
- reject:消息处理失败并拒绝该消息,RabbitMQ从队列中删除该消息

消费者失败处理
开启重试模式后,重试次数耗尽,如果消息依然失败,需要有MessageRecover接口来处理,包含三种不同的实现:
- RejectAndDontRequeueRecover:重试耗尽后,直接reject,丢弃消息。默认这种方式
- ImmediateRequeueMessageRecoverer:重试耗尽后,返回nack,消息重新入队
- RepublishMessageRecoverer:重试耗尽后,将失败消息投递到指定交换机

业务幂等性

面试也会经常问到,如何保持业务幂等性。
第一种是加上唯一ID

如何保证支付服务与交易服务之间的订单状态一致性

如果交易服务消息处理失败,有没有什么失败兜底方案

延时消息
延时消息:生产者发送消息指定一个时间,消费者不会立刻收到消息,而是在指定时间后才收到消息
延时任务:设置一定时间之后才执行的任务

死信交换机


