|
|
|
|
# RabbitMQ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 1. RabbitMQ 基础
|
|
|
|
|
|
|
|
|
|
- 官方QuickStart:
|
|
|
|
|
- 官方文档:
|
|
|
|
|
- 最新版本 【截止2022-7-20】
|
|
|
|
|
- 学习版本 【截止2022-7-20】
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1 概念及问题
|
|
|
|
|
- 中间件: (Middleware), 是提供软件和软件之间连接的软件, 以便于软件各部分之间的沟通
|
|
|
|
|
- 同步调用的问题
|
|
|
|
|
- 业务调用链过长, 用户等待时间长
|
|
|
|
|
- 部分组件故障会瘫痪整个业务
|
|
|
|
|
- 业务高峰期没有缓冲
|
|
|
|
|
- 异步调用的问题
|
|
|
|
|
- 解决了同步调用的问题
|
|
|
|
|
- 业务高峰期时产生大量的异步线程, 造成线程池不够用或内存爆满
|
|
|
|
|
- 使用中间件的优势
|
|
|
|
|
- 业务调用链短, 用户等待时间短
|
|
|
|
|
- 部分组件故障不会瘫痪整个业务
|
|
|
|
|
- 业务高峰期有缓冲
|
|
|
|
|
- 业务高峰期不会产生大量的异步线程
|
|
|
|
|
- 消息中间件的作用
|
|
|
|
|
- 异步处理
|
|
|
|
|
- 系统解耦
|
|
|
|
|
- 流量的削峰和流控
|
|
|
|
|
- 消息广播
|
|
|
|
|
- 消息收集
|
|
|
|
|
- 最终一致性
|
|
|
|
|
|
|
|
|
|
### 1.2 消息中间件的技术选型
|
|
|
|
|
- ActiveMQ
|
|
|
|
|
- 由Apache出品, Java开发, 支持JMS1.1协议和J2EE1.4规范
|
|
|
|
|
- 支持广泛的连接协议: OpenWire/STOMP/REST/XMPP/AMQP
|
|
|
|
|
- 支持多种语言客户端, 支持插件
|
|
|
|
|
- 管理方便, 便于配置集群代理
|
|
|
|
|
- 优点:
|
|
|
|
|
- A>. 基于Java, 跨平台运行
|
|
|
|
|
- B>. 可以用JDBC连接多种数据库
|
|
|
|
|
- C>. 有完善的界面, 监控, 安全机制
|
|
|
|
|
- D>. 自动重连和错误重试
|
|
|
|
|
- 缺点:
|
|
|
|
|
- A>. 社区活跃度不高
|
|
|
|
|
- B>. 目前重点放到6.0产品Apollo, 对5的Bug维护较少
|
|
|
|
|
- C>. 不适合用于上千个队列的应用场景
|
|
|
|
|
- RabbitMQ
|
|
|
|
|
- 当前国内最主流的消息中间件
|
|
|
|
|
- 高可靠性, 支持发送确认, 投递确认等特性
|
|
|
|
|
- 高可用, 支持镜像队列
|
|
|
|
|
- 支持插件
|
|
|
|
|
- 优点:
|
|
|
|
|
- A>. 基于Erlang, 支持高并发
|
|
|
|
|
- B>. 支持多平台, 多种客户端, 文档齐全
|
|
|
|
|
- C>. 可靠性高
|
|
|
|
|
- D>. 在互联网公司有较大规模的应用, 社区活跃度高
|
|
|
|
|
- 缺点:
|
|
|
|
|
- A>. Erlang语言较为小众, 不利于二次开发
|
|
|
|
|
- B>. 代理架构下, 中央节点增加了延迟, 影响性能
|
|
|
|
|
- C>. 使用AMQP协议, 使用起来有学习成本
|
|
|
|
|
- RocketMQ
|
|
|
|
|
- 阿里巴巴团队开发, 经受住双十一的考验
|
|
|
|
|
- 能够保证严格的消息顺序
|
|
|
|
|
- 亿级的消息堆积能力
|
|
|
|
|
- 丰富的消息拉取模式
|
|
|
|
|
- 优点:
|
|
|
|
|
- A>. 基于Java, 跨平台运行, 方便二次开发
|
|
|
|
|
- B>. 单机支持1万以上持久化队列
|
|
|
|
|
- C>. 内存与硬盘都有一份数据, 保证性能+高可用
|
|
|
|
|
- C>. 开发度较活跃, 版本更新很快
|
|
|
|
|
- 缺点:
|
|
|
|
|
- A>. 客户端种类不多, 较成熟的是Java及C++
|
|
|
|
|
- B>. 运维复杂
|
|
|
|
|
- C>. 我觉得没缺点 (*^▽^*)
|
|
|
|
|
- Kafka
|
|
|
|
|
- Linkedln 开发的分布式日志提交系统
|
|
|
|
|
- 独特的分区特性, 适用于大数据系统
|
|
|
|
|
- 性能高效, 可扩展性良好
|
|
|
|
|
- 可复制, 可容错
|
|
|
|
|
- 优点:
|
|
|
|
|
- A>. 原生的分布式系统
|
|
|
|
|
- B>. 零拷贝技术, 减少IO操作步骤, 提高系统吞吐量
|
|
|
|
|
- C>. 快速持久化, 可以在O(1)的系统开销下进行消息持久化
|
|
|
|
|
- D>. 支持数据批量发送和拉取
|
|
|
|
|
- 缺点:
|
|
|
|
|
- A>. 单机超过64个队列/分区时, 性能明显劣化
|
|
|
|
|
- B>. 使用轮询方式, 实时性取决于轮询间隔时间
|
|
|
|
|
- C>. 消费失败不支持重试
|
|
|
|
|
- D>. 可靠性比较差(不适合做业务系统,适合做大数据和日志系统)
|
|
|
|
|
|
|
|
|
|
### 1.3 RabbitMQ 高性能的原因
|
|
|
|
|
- Erlang
|
|
|
|
|
- 由爱立信公司开发(Ericsson Language)
|
|
|
|
|
- 一门为交换机软件开发诞生的编程语言
|
|
|
|
|
- 特点
|
|
|
|
|
- 通用的面向开发的编程语言, 适用于分布式系统
|
|
|
|
|
- 基于虚拟机解释运行, 跨平台部署
|
|
|
|
|
- 进程间上下文切换的频率远高于C语言
|
|
|
|
|
- 有着和原生Socket一样的延迟
|
|
|
|
|
- RabbitMQ应用
|
|
|
|
|
- 互联网TMD都在用
|
|
|
|
|
- RabbitMQ在银行和金融领域也有相当高的占有率, 甚至微服务之间的通信大部分都是依靠消息,RabbitMQ 使用量最大
|
|
|
|
|
|
|
|
|
|
### 1.4 AMQP 协议
|
|
|
|
|
- 意义:
|
|
|
|
|
- AMQP协议作为RabbitMQ的规范, 规定了RabbitMQ对外接口
|
|
|
|
|
- 学会了AMQP使用就基本会了RabbitMQ
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
[Connection] [Connection]
|
|
|
|
|
—————————— ———————————————————————————————————————— ——————————
|
|
|
|
|
| Channel | | ———————————————————————————————— | | Channel |
|
|
|
|
|
Publisher ---> RoutingKey[Message] --> | Channel |--> | | Exchange----(Binding)---->Queue | |--> | Channel | --> Consumer
|
|
|
|
|
| Channel | | | | | | Channel |
|
|
|
|
|
—————————— | | Exchange----(Binding)---->Queue | | ——————————
|
|
|
|
|
| | | | |
|
|
|
|
|
| | -(Binding)---->Queue | |
|
|
|
|
|
| | [Virtual Host] | |
|
|
|
|
|
| ———————————————————————————————— |
|
|
|
|
|
| [Message Broker] |
|
|
|
|
|
————————————————————————————————————————
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
- Broker: 接收和分发消息的应用, RabbitMQ就是Message Broker
|
|
|
|
|
- Virtual Host: 虚拟Broker, 将多个单元隔离开
|
|
|
|
|
- Connection: publisher/consumer和broker之间的TCP连接, 在物理上也是存在的
|
|
|
|
|
- Channel: connection 内部建立的逻辑连接,通常每个线程创建单独channel
|
|
|
|
|
- Routing key: 路由键, 用来指示消息的路由转发, 相当于快递的地址
|
|
|
|
|
- Exchange: 交换机, 相当于快递的分拨中心
|
|
|
|
|
- 在AMQP协议或者是RabbitMQ实现中, 最核心的组件是Exchange
|
|
|
|
|
- Exchange承担RabbitMQ的核心功能————路由转发
|
|
|
|
|
- Exchange有多个种类, 配置多变, 需要详细讲解
|
|
|
|
|
- Queue: 消息队列, 消息最终被送到这里等待consumer取走
|
|
|
|
|
- Binding: exchange和queue之间的虚拟连接, 用于message的分发依据
|
|
|
|
|
|
|
|
|
|
### 1.5 RabbitMQ核心-Exchange解析
|
|
|
|
|
- Exchange的功能是根据绑定关系和路由键为消息提供路由将消息转发至相应的队列
|
|
|
|
|
- Exchange有4种类型: Direct/Topic/Fanout/Headers,其中Headers使用很少,以前3种为主
|
|
|
|
|
|
|
|
|
|
#### A. Direct Exchange
|
|
|
|
|
- Message中的Routing Key如果和BindingKey一致, Direct Exchange则将message发到对应的queue中
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
|
|
|
|
Routing Key -->
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 2. RabbitMQ基本用法,开发项目
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 3. 利用RabbitMQ高级特性,完善项目的可靠性
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 4. RabbitMQ与SpringBoot适配,利用工具类简化项目
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 5. RabbitMQ集群入门——手动搭建集群并容灾实验
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 6. RabbitMQ集群高可用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 7. 基于RabbitMQ开发分布式事务框架
|