RabbitMQ 的介绍及核心概念讲解

RabbitMQ 是什么?

MQ 全称为 Message Queue,即消息队列, 它也是一个队列, 遵循FIFO原则,RabbitMQ 是由 erlang 语言开发,基于 AMQP(Advanced Message Queue Protocol高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,在分布式系统开发中应用非常广泛,简而言之,RabbitMQ 就是一个消息队列。

什么是消息队列?

消息队列是一种用于在分布式系统中进行通信的技术,它是一种存储和转发消息的中间件,可以用于将应用程序之间的通信解耦,从而实现高效的异步通信,消息队列允许发送者将消息发送到队列中,而接收者则可以从队列中获取消息并进行处理,这种方式可以帮助系统实现高可用性、高性能、松耦合和可伸缩性,消息队列通常包括生产者(发送消息的应用程序)、消费者(接收消息的应用程序)和队列(存储消息的缓冲区),常见的消息队列有 Kafka、RocketMQ、RabbitMQ、Redis 等。

消息队列的使用场景

消息队列在项目中的使用场景主要用于,异步、削峰、解耦。

  • 异步:异步处理,异步调用,比如用户注册成功后发送注册成功的短信,就可以使用 MQ 异步来发送。
  • 削峰:用于高并发请求场景,消除高并发场景的峰值流量,让请求在 MQ 中排队执行。
  • 解耦:服务解耦,服务与服务之间的 RPC 调用是同步的,调用方必须等待服务提供方响应结果后才能继续执行业务,使用 MQ 后服务间的通讯是异步的,服务之间没有直接调用关系,让服务解耦了。

什么是 AMQP 协议?

AMQP 是一套公开的消息队列协议,最早是在 2003 年被提出,从协议层定义了消息通信数据的标准格式,目的是解决 MQ 市场上协议不统一的问题,RabbitMQ 就是遵循 AMQP 标准协议开发的 MQ 服务。

RabbitMQ 的核心概念

  • Broker:RabbitMQ 的服务节点,代理服务器,Broker 包含 Exchange 和 Queue。
  • Exchange:交换器,交换器是消息接受和路由的中心,它接受来自生产者得消息,并将消息路由到与之绑定的一个或多个队列上,如果路由不到队列,则丢弃或者或者返回给生产者。
  • Queue:队列,用于存储消息,生产者发送消息到队列,消费者从队列中消费消息,多个订阅者可以订阅同一个队列,这样消息会被分配到多个消费者消费。
  • BindingKey:绑定交换器和路由之间的关系,它定义了交换器将消息路由到哪些队列中,消费者可以通过 BindingKey 来消费消息。
  • RoutingKey:路由键,用于指定消息的路由规则的,是消息的一个属性,生产者将消息发送给交换机的时候,交换机会使用 RoutingKey 将消息路由到指定的队列中。
  • Consumer:消费者,从队列中接收消息并处理消息。
  • VHost:Rabbit 中的虚拟主机,类似名称空间的概念,用于将 Rabbit 资源进行隔离和分组,每个 VHost 都有自己的交换机、队列、绑定等,不同 VHost 之间的资源相互隔离互不影响,VHost 可以用于将不同的应用和服务进行隔离,可以防止彼此之间的消息冲突和资源竞争。
  • Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低,会影响 RabbitMQ 的性能,因此 RabbitMQ 使用了 Channel 这个做法,Channel 是在同一个 Connection 内部建立的逻辑连接,可以把Channel 理解为一个轻量级的 Connection,Channel 的存在极大减少了操作系统建立 TCP Connection 的开销,如果应用程序支持多线程,通常每个 Thread 创建单独的 Channel 进行通讯,AMQP method 包含了channel id 帮助客户端和 Message Broker 识别 Channel ,所以 Channel 之间是完全隔离的。

RabbitMQ 交换机类型

  • Direct Exchange(直连交换机):RoutingKey 完全匹配模式,也就是我们常说的点对点模式,消息会传送给 RoutingKey 完全匹配的队列。
  • Topic Exchange(主题交换机):主题交换机支持路由模糊匹配,可以使用星号()和井号(#)作为通配符进行匹配,其中()可以代替一个单词,(#) 可以代替任意个单词。
  • Fanout Exchange(扇形交换机):扇形交换机,一个交换器可以绑定多个队列,只要交换机接收到消息就会发送给所有和它绑定的队列,不再进行 RoutingKey 判断,也就是我们常说的发布订阅模式。
  • Headers Exchange(头交换机):Header Exchange 不依赖 RoutingKey 的判断,而是根据发送的消息内容中的 headers 属性进行匹配,当消息投递到首部交换器时,RabbitMQ 会获取到该消息的 headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配,则消息会路由到该队列,否则不会路由到该队列。
  • Backup Exchange(备份交换机):RabbitMQ 本身是不存在备份交换机类型的,备份交换机是抽象出来的一个概念,通过设置交换机的 alternate-exchange 的屬性,属性值是交换机的名称,设置当前交换机的备份交换机,当消息路由无法在当前交换机匹配到合适的队列投递时,将会把消息转到备份交换机,分发到其绑定的备份队列中,备份交换机一般使用扇形交换机,因为其不需要进行路由匹配。
  • Dead Exchange(死信交换机):同备份交换机一样 RabbitMQ 本身是不存在死信交换机类型的,死信交换机可以理解成一个拥有特殊意义的直连交换机,通过设置队列中的 x-dead-letter-exchange 和 x-dead-letter-routing-key 属性来设置绑定死信交换机,当消费者拒绝消费、消息积压队列达到最大长度或者消息过期时,消息从正常队列转到死信队列,死信在转移到死信队列时,它的路由是会保存下来,但是如果配置了 x-dead-letter-routing-key 参数的话,路由就会被替换为配置的这个值,死信在转移到死信队列的过程中,是没有经过消息发送者确认的,所以并不能保证消息的安全性。

RabbitMQ 的工作流程

RabbitMQ 工作流程简图如下:

在这里插入图片描述

消息发布流程:

  • 生产者和 Broker 建立 TCP 连接。
  • 生产者和 Broker 建立通道。
  • 生产者通过通道消息发送给 Broker,由 Exchange 将消息转发。
  • Exchange 根据绑定管理将消息转发到指定的 Queue(队列)中。

消息接收消息:

  • 消费者和 Broker 建立 TCP 连接。
  • 消费者和 Broker 建立通道。
  • 消费者监听指定的 Queue(队列)。
  • 当有消息到达 Queue 时 Broker 默认将消息推送给消费者。
  • 消费者接收到消息进行业务处理。

如有不正确的地方请各位指出纠正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值