介绍
RabbitMQ是面向消息而设计的、遵循高级消息队列协议(AMQP)的分布式消息中间件。Erlang语言开发。同时内置管理控制台。
应用:
- 异步通信
- 接口限流
- 服务解耦
- 消息分发
- 业务延迟处理
应用场景
- 用户注册服务解耦
- 电商抢购异步限流
- 电商抢购成功后消息异步分发告知用户抢购成功
- 12306抢票后延迟处理(30分钟内支付),替代传统定时器轮询
核心基础组件
- 生产者
- 消费者
- 消息
- 对列
- 交换机
- 路由
生产者
生产,发送消息的程序
消费者
监听,接收,消费和处理消息的程序
消息
实际传送的数据,RabbitMQ底层都是用二进制数据流进行传输
队列
消息的暂存区或者缓存区,消息的中转站。
交换机
也可以看作消息的中转站,首次接收和分发消息,包括Headers,Fanout,Direct,Topic。
路由
一般不单独使用,与路由绑定在一起。相当于密钥,地址或者第三者。将消息路由到指定队列。
消息模型图
核心组件
- 基于HeadersExchange的消息模型
- 基于FanoutExchange的消息模型
- 基于DirectExchange的消息模型
- 基于TopicExchanged的消息模型
基于FanoutExchange的消息模型
具有“广播消息”的作用。
结构图
特点
交换机与队列是1对多的关系,消息生产经交换机中转,分发至绑定的N条队列中,最终由队列所绑定的消费者进行监听接收处理消息。
步骤:
- 创建消息模型(创建队列1、队列2;创建交换机FanoutExchange;创建绑定1、绑定2)
- 创建对象实体信息
- 开发生产消息的生产者类(设置广播式交换机)
- 开发用于监听接收消费处理消息的消费者,开发两条队列分别对应的监听消费方法
基于FaountExchange的消息模型小结:
适用于“业务数据需要广播式传输”的场景,比如“用户操作写日志”。使用基于广播式的交换机进行接收和处理。
基于DirectExchnge的消息模型
“直连传输消息”,交换机检查绑定的路由,找到绑定模型,则进行消息传输到指定队列,为严格意义上的绑定,必须指定特定的交换机和路由,并绑定到指定队列中。
结构图:
步骤:
- 创建基于DirectExchange的消息模型(创建绑定路由1、路由2;创建交换机DirectExchange;创建队列1、队列2)
- 创建对象实体信息
- 开发生产消息的生产者类(需要开发两个用于发送消息的生产者方法)
- 开发用于监听接收消费处理消息的消费者,开发两条队列分别对应的监听消费方法
几乎90%的业务场景都可以用DirectExchange消息模型实现
基于TopicExchange消息模型
发布-主题-订阅式的交换机,应用广泛。支持“通配式”路由,可以通过为路由的名称指定特定通配符“*”和“#”。
- *:表示1个特定的“单词”
- #:表示任意单词(1个、N个或没有)
当路由名称包含*时,由于*相当于1个单词,因此这种消息模型降级为“基于DirectExchange的消息模型”;当路由名称包含“#”时,由于#相当于0个或N个单词,此时这种消息模型相当于“基于FanoutExchange的消息模型”。
结构图:
总结:基于TopicExchange的消息模型,几乎所有业务场景都适用,“王牌”消息模型,具有普适性。
确认消费机制
消息高可用和确认消费
问题:
- 是否发送成功?
- RabbitMQ宕机或崩溃导致的消息丢失?
- 监听失败或者崩溃熬制的重复消费
解决: - 发送确认机制:生产确认
- 创建队列、交换机时设置持久化参数为true,消息不丢失
- ACK模式保证消息不重复消费。(NONE、AUTO、MANUAL)
实际生产中,使用消息的确认机制避免重复消费。
-
NONE:“无须确认”机制。比如“用户禁止某个app应用的通知提醒”
-
AUTO:“自动确认”机制。消费者发送AUTO ACK的反馈信息给RabbitMq服务器。
-
MANUAL:“人为手动确认消费” 。消费者手动发送ACK给服务器,之后该消息会被移除,同时告知生产者。