RabbitMQ–基础–12–总结
1、RabbitMQ 中既然有了connections 为什么还要有 channel?
- connection 是 生产者或消费者与 RabbitMQ Broker 建立的连接,是一个TCP连接
- 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP信道(Channel),每个信道都会被指派一个唯一的 ID
- 信道是建立在 Connection 之上的虚拟连接,多个信道复用一个TCP连接,可以减少性能开销,同时也便于管理,因为一个应用需要向RabbitMQ 中生成或者消费消息的话,都要建一个TCP连接,TCP连接开销非常大,如果遇到使用高峰,性能瓶颈也随之显现
1.1、信道复用连接优势
- 复用TCP连接,减少性能开销,便于管理
- RabbitMQ 保障每一个信道的私密性
1.2、单一Connection的优缺点
- 当每个信道的流量不是很大时,复用单一的 Connection 可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源
- 信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了,此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中
2、RabbitMQ 持久化
2.1、工作原理
Rabbit 会将持久化消息写入磁盘上的持久化日志文件,等消息被消费之后,Rabbit 会把这条消息标识为等待垃圾回收
2.2、持久化的优缺点
2.2.1、优点
数据持久化,数据不丢失
2.2.2、缺点
对性能有影响,写硬盘比写内存性能低,从而降低服务的吞吐量
3、RabbitMQ ACK 应答机制
ACK 应答分为手动和自动,各有优劣
- 如果消息不太重要,丢失也没有影响,那么自动 ACK 会比较方便
- 如果消息非常重要,不容丢失。那么最好在消费完成后手动 ACK,否则接收消息后就自动 ACK,RabbitMQ 就会把消息从队列中删除。若此时消费者宕机或处理业务失败,那么消息就丢失了
3.1、ACK 机制的开发注意事项
如果忘记了 ACK,那么后果很严重
当 Consumer 退出时候,Message 会一直重新分发,然后 RabbitMQ 会占用越来越多的内容,由于 RabbitMQ 会长时间运行,这个"内存泄漏"是致命的
4、为什么需要限流,消费者流量控制
- 某一时刻,生产者在 RabbitMQ 队列中堆积了很多消息,此时有一个消费者启动,大量的消息会推送到消费者上面,这种瞬时大流量会把消费者打挂
- 生产者和消费者效率不平衡的情况,会导致消费者端性能下降,服务端卡顿或者崩溃
5、存储机制
5.1、持久化消息
持久化的消息在到达队列时就被写入磁盘,持久化的消息也会在内存中保存一份备份,这样可以提高一定的性能,当内存吃紧的时候会从内存中清除
5.2、非持久化消息
一般只保存在内存中,在内存吃紧的时候会被换入到磁盘中,以节省内存空间
6、RabbitMQ中消息的几种状态
6.1、alpha
消息内容(包括消息体、属性和 headers) 和消息索引都存储在内存中
6.2、beta
消息内容保存在磁盘中,消息索引保存在内存中
6.3、gamma
消息内容保存在磁盘中,消息索引在磁盘和内存中都有
6.4、delta
消息内容和索引都在磁盘中
7、RabbitMQ 的队列结构
7.1、rabbit_amqqueue_process
负责协议相关的消息处理
1. 接收生产者发布的消息
2. 向消费者交付消息
3. 处理消息的确认等
7.2、backing_queue
- 是消息存储的具体形式和引擎,并
- 向 rabbit_amqqueue_process 提供相关的接口以供调用
8、交换器无法根据自身类型和路由键找到符合条件队列时,会如何处理?
交换机有个参数mandatory,可以解决这个问题
8.1、mandatory=true
如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,那么broker就会调用basic.return方法将消息返还给生产者
8.2、mandatory=false
如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,此时 broker会直接将消息丢弃
9、如何保证消息可靠性嘞?
9.1、消息从生产者到 MQ
由事务机制,确认机制 来保障
9.2、MQ 自身可靠性
由持久化、集群、普通模式、镜像模式来保证
9.3、MQ 消息到消费者
由basicAck机制、死信队列、消息补偿等机制来保证
10、集群中的节点类型有哪些?
10.1、内存节点
- ram
- 将变更写入内存。
10.2、磁盘节点
- disc
- 磁盘写入操作
- RabbitMQ中要求最少有一个磁盘节点
11、如何保证 RabbitMQ 消息队列的高可用
有三种模式来保证
11.2、单机模式
- 一般是本地启动,自己学习和测试使用
- 不会用在生产环境上
11.2、普通集群模式
- 在多台机器上启动多个 RabbitMQ 实例
- 每个机器启动一个
11.2、镜像集群模式
- RabbitMQ的高可用模式
- 跟普通集群模式不一样的是,创建的 queue,无论元数据(元数据指 RabbitMQ 的配置数据)还是 queue 里的消息都会存在于多个实例上
- 每次写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 里