RabbitMQ--基础--12--总结

RabbitMQ–基础–12–总结


1、RabbitMQ 中既然有了connections 为什么还要有 channel?

  1. connection 是 生产者或消费者与 RabbitMQ Broker 建立的连接,是一个TCP连接
  2. 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP信道(Channel),每个信道都会被指派一个唯一的 ID
  3. 信道是建立在 Connection 之上的虚拟连接,多个信道复用一个TCP连接,可以减少性能开销,同时也便于管理,因为一个应用需要向RabbitMQ 中生成或者消费消息的话,都要建一个TCP连接,TCP连接开销非常大,如果遇到使用高峰,性能瓶颈也随之显现

在这里插入图片描述

1.1、信道复用连接优势

  1. 复用TCP连接,减少性能开销,便于管理
  2. RabbitMQ 保障每一个信道的私密性

1.2、单一Connection的优缺点

  1. 当每个信道的流量不是很大时,复用单一的 Connection 可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源
  2. 信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了,此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中

2、RabbitMQ 持久化

2.1、工作原理

Rabbit 会将持久化消息写入磁盘上的持久化日志文件,等消息被消费之后,Rabbit 会把这条消息标识为等待垃圾回收

2.2、持久化的优缺点

2.2.1、优点

数据持久化,数据不丢失

2.2.2、缺点

对性能有影响,写硬盘比写内存性能低,从而降低服务的吞吐量

3、RabbitMQ ACK 应答机制

ACK 应答分为手动和自动,各有优劣

  1. 如果消息不太重要,丢失也没有影响,那么自动 ACK 会比较方便
  2. 如果消息非常重要,不容丢失。那么最好在消费完成后手动 ACK,否则接收消息后就自动 ACK,RabbitMQ 就会把消息从队列中删除。若此时消费者宕机或处理业务失败,那么消息就丢失了

3.1、ACK 机制的开发注意事项

如果忘记了 ACK,那么后果很严重

当 Consumer 退出时候,Message 会一直重新分发,然后 RabbitMQ 会占用越来越多的内容,由于 RabbitMQ 会长时间运行,这个"内存泄漏"是致命的

4、为什么需要限流,消费者流量控制

  1. 某一时刻,生产者在 RabbitMQ 队列中堆积了很多消息,此时有一个消费者启动,大量的消息会推送到消费者上面,这种瞬时大流量会把消费者打挂
  2. 生产者和消费者效率不平衡的情况,会导致消费者端性能下降,服务端卡顿或者崩溃

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

  1. 是消息存储的具体形式和引擎,并
  2. 向 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、内存节点

  1. ram
  2. 将变更写入内存。

10.2、磁盘节点

  1. disc
  2. 磁盘写入操作
  3. RabbitMQ中要求最少有一个磁盘节点

11、如何保证 RabbitMQ 消息队列的高可用

有三种模式来保证

11.2、单机模式

  1. 一般是本地启动,自己学习和测试使用
  2. 不会用在生产环境上

11.2、普通集群模式

  1. 在多台机器上启动多个 RabbitMQ 实例
  2. 每个机器启动一个

11.2、镜像集群模式

  1. RabbitMQ的高可用模式
  2. 跟普通集群模式不一样的是,创建的 queue,无论元数据(元数据指 RabbitMQ 的配置数据)还是 queue 里的消息都会存在于多个实例上
  3. 每次写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 里
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值