【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

一、消息队列的作用

1.为什么要用消息队列

随着互联网的发展,业务场景也越来越复杂,导致系统之间的耦合度越来越高,开发维护的成本也越来越高。这个时候就需要一个中间件来解耦,这是使用消息队列的主要原因。此外,还有异步和削峰的需求

2.消息队列有什么作用

异步
举一个电商支付的例子,首先肯定会涉及到生成订单,用户消费后会赠送积分,这就涉及到积分发放。还有的时候有促销活动,消费送现金卷,又会涉及到现金卷发放。这样,一个支付流程就至少需要经历生成订单、积分发放和现金卷发放三个步骤,如果采用同步的方式,就会发生阻塞,每增加一个步骤,支付业务的总时长就会相应增加,用户的体验肯定会变差。因此我们需要采用异步的方式,让这几个步骤同时执行,可以大大缩短业务处理的总时长

解耦
虽然使用线程池也可以实现同时执行多个步骤,但是这样就提高了代码之间的耦合度,使得开发维护的成本提高,随着业务扩展,只会越来越难以维护。这就是消息队列的第二个作用,解耦

削峰
最后是削峰,假如一个系统能承载的最大并发请求量是一万,突然有一个时刻来了两万的并发请求,为了防止系统崩溃就可以使用消息队列进行削峰,将两万并发请求路由到消息队列中,消息队列控制同一时段只传输一万的并发量

3.消息队列会带来什么问题

  1. 消息重复投递和消息重复消费
  2. 消息丢失
  3. 消息传递的顺序性
  4. 消息队列可用性

二、主流的消息队列

市场上主流的消息队列有 ActiveMQ、RocketMQ、Kafka 和 RabbitMQ

ActiveMQ 社区活跃度不高,更新太慢。底层原理只是对 JMS 进行了封装,对比其他 MQ 没有明显的性能优势

Kafka 虽然单机吞吐量非常高,但是只支持最基本的消息传递功能,不支持消息查询和回溯,因此一般只应用于大数据开发和日志采集

RocketMQ 的功能非常完备,采用分布式架构,在单机吞吐量和可用性上都有明显的优势,并且是使用 Java 开发的,进行二次开发的难度相对较低

RabbitMQ 是使用 Erlang 开发的,单机吞吐量和可用性不如 RocketMQ,但是 RabbitMQ 消息传递的延迟更低,因此如果对于单机吞吐量和可用性的需求不高的话,使用 RabbitMQ 是个很好的选择

三、RabbitMQ 基于什么传输消息

在这里插入图片描述

生产者和消费者都需要与 RabbitMQ 节点建立连接,这个连接就是 TCP 连接。除了 TCP 连接,RabbitMQ 还有信道的概念,每个客户端都和 RabbitMQ 节点间用信道传输,但是实际上使用的都是同一条 TCP 连接,也就是 I/O 多路复用技术。如果每增加一个客户端就建立一条 TCP 连接,必然需要额外耗费系统的性能,如果遇到流量高峰,就会出现性能瓶颈的问题。但是当信道本身的流量很大时,这时多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节

四、RabbitMQ 模型架构

AMQP
RabbitMQ 中的交换器、交换器类型、队列、绑定、路由键等都是遵循的 AMQP 协议中相应的概念,可以这样说,RabbtiMQ 就是 AMQP 协议的 Erlang 的实现

AMQP 本质上是一种应用层的通信协议,可以看作一系列结构化命令的集合,类似于 HTTP 中的 GET、POST 等方法,例如声明一个队列,或者消费一条消息

在这里插入图片描述

RabbitMQ 的模型包括生产者、交换器、队列和消费者

从整体上看,RabbitMQ 是一个生产者与消费者模型,负责接收、存储和转发消息。从局部上看,RabbitMQ 更像是一种交换机模型,生产者通过 RabbitMQ 将消息路由到指定队列中,队列再将消息路由到消费者

生产者和消费者不需要过多介绍

交换器

生产者将消息发送到交换器,由交换器路由到一个或多个队列中。交换器有四种类型:

  1. fanout:会将消息路由到所有与该交换器绑定的队列
  2. direct:会将消息路由到路由键和绑定键完全匹配的队列
  3. topic:会将消息路由到路由键和绑定键模式匹配的队列
  4. headers:会获取消息的 headers 属性,然后路由到匹配的队列中

五、死信队列和延迟队列

1.死信队列

当队列中的消息出现以下情形,会变成死信:

  • 消息被拒绝
  • 消息过期
  • 队列达到最大长度

死信会被发往死信交换器,与死信交换器绑定的队列就是死信队列。我们可以通过分析程序来消费死信队列中的消息来分析当时遇到的异常情况,进而改善和优化系统

2.延迟队列

生产者发送消息以后,我们希望消费者等待指定时间后才能拿到这个消息,比如:

  1. 用户下单后 30 分钟内需要支付,如果 30 分钟之内没有支付成功,这个订单将执行异常处理
  2. 智慧家居系统中,用户希望通过手机遥控智能设备在指定时间内工作

实现原理是当生产者生产消息时,为消息设置指定过期时间,当消息过期时就会进入死信队列。此时,消费者订阅的并不是普通的队列,而是与这个普通队列绑定的死信队列,当消息因为过期进入死信队列的时候就会被消费者消费,从而实现了延迟队列

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

313YPHU3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值