RabbitMQ:基础概述

IT知识
452
0
0
2023-01-13
标签   RabbitMQ
RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。 RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。 ~ 本篇内容包括:RabbitMQ 简介、RabbitMQ 相关概念

文章目录

  • 一、RabbitMQ 简介
  • 1、RabbitMQ 简介
  • 2、关于 erlang 语言
  • 3、关于 AMQP 协议
  • 4、关于 消息队列
  • 二、RabbitMQ 相关概念
  • 1、Broker 节点
  • 2、Exchange 消息交换机
  • 3、Queue 消息队列
  • 4、Binding 绑定
  • 5、Routing Key 路由关键字
  • 6、VHost
  • 7、Producer 消息生产者
  • 8、Consumer 消息消费者
  • 9、Channel 信道

一、RabbitMQ 简介

1、RabbitMQ 简介

RabbitMQ 是一个消息中间件,它接收消息并且转发,是“消费-生产者模型”的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

img

RabbitMQ 于 2007 年发布,由 erlang 语言进行开源实现,基于 AMQP(Advanced Message Queue 高级消息队列协议)基础上完成的。RabbitMQ 是当前最主流的消息中间件之一。

2、关于 erlang 语言

Erlang 是一门通用编程语言,主要用途是构建并发应用程序,在 1991 年由爱立信公司向用户推出了第一个版本。目的是创造一种可以应付大规模并发活动的程序设计语言和运行环境。现在 Erlang 主要用于电信行业、Web 应用、分布式计算、即时消息、电子商务等领域,负责处理大规模的并发持续连接。

3、关于 AMQP 协议

AMQP(Advanced Message Queuing Protocol)高级消息队列协议,一个提供统一消息服务的应用层标准协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP是一个进程间传递异步消息的网络协议。

基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。

Ps:我们对 RabbitMQ 的学习和掌握在很大程度上就是对 AMQP 的学习和掌握!

4、关于 消息队列

消息队列 是在消息的传输过程中保存消息的容器。

消息队列 是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

消息队列的作用:

  • 解耦:主要是消息中间件的发布订阅功能,订阅的消息,采用拉/推的方式,避免了接口间调用时出现问题而产生阻塞的场景;
  • 异步:对于一次复杂操作可能需要耗时很长,这时候就可以对其进行时序性要求不高的功能进行拆分,通过发送消息来异步执行以提高系统响应速度;
  • 削峰:针对于大并发场景,大量请求到数据库对数据库造成压力,此时可以采用消息队列将请求信息缓存,然后按照数据库承受量对消息进行消费。

二、RabbitMQ 相关概念

1、Broker 节点

简单来说 Broker 就是消息队列服务器实体。

我们把部署 RabbitMQ 的机器称为节点,也就是 Broker。Broker 有 2 种类型节点:

  • 磁盘节点:磁盘节点的 Broker 把元数据存储在磁盘中,磁盘节点的 Broker 在重启后元数据可以通过读取磁盘进行重建,保证了元数据不丢失
  • 内存节点:内存节点的 Broker 把元数据存储在内存中,内存节点的 Broker 可以获得更高的性能,但在重启后元数据就都丢了。

2、Exchange 消息交换机

Exchange 的可以说是“人如其名”,在 RabbitMQ 的消息传递模型中,对于 Exchange 的核心思想就是:生产者生产的消息从不会直接发送到队列,生产者只能将消息发送到交换机。交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。

Exchanges 的类型:直接(direct)、主题(topic)、标题(headers)、扇出(fanout)

3、Queue 消息队列

Queue 即消息队列载体,是 RabbitMQ 的内部对象,用于存储消息队列,并将它们转发给消费者,每个消息都会被投入到一个或多个队列(Queue)

img

4、Binding 绑定

Binding 绑定,RabbitMQ 中通过 Binding 将 Exchange 与 Queue 关联起来,在绑定的时候一般会指定一个 BindingKey(绑定建) ,这样 RabbitMQ 就知道如何正确将消息路由到队列了。

如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmOW94Tk-1670682296011)(https://lizhengi.oss-cn-beijing.aliyuncs.com/BenjaminNode/Binding%20(1)].png)

一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange 和 Queue 的绑定可以是多对多的关系。

5、Routing Key 路由关键字

Routing Key 路由关键字,exchange 根据这个关键字进行消息投递

Exchange 接收到的消息会带有 RoutingKey 这个字段,Exchange 就是根据这个 RoutingKey 和当前 Exchange 所有绑定的 BindingKey 做匹配,如果满足要求,就往 BindingKey 所绑定的 Queue 发送消息,这样我们就解决了我们向 RabbitMQ 发送一次消息,可以分发到不同的 Queue 的过程

  • RoutingKey:指定当前消息被谁接受
  • BindingKey:指定当前 Exchange 下,什么样的 RoutingKey 会被下派到当前绑定的 Queue 中

Ps:由 Exchange、Queue、RoutingKey 三个才能决定一个从 Exchange 到 Queue的 唯一的线路。

6、VHost

VHost 可以理解为虚拟 Broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,但最最重要的是,其拥有独立的权限系统,可以做到 VHost 范围的用户控制。当然,从 RabbitMQ 的全局角度,VHost 可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同的 VHost 中)。

7、Producer 消息生产者

Producer 消息的生产者,也就是发送消息的一方,消息一般包含两个部分:消息体(payload)和标签(Label)

8、Consumer 消息消费者

Consumer 消息的消费者,也就是接受消息一方,连接上 RabbitMQ 服务器,并订阅到队列上。消费消息只消费消息体,丢弃标签。

9、Channel 信道

Channel 信道是生产者/消费者与 RabbitMQ 通信的渠道,生产者 publish 或者消费者消费一个队列都是需要通过信道来通信的。信道是建立在 TCP 上面的虚拟链接,也就是 RabbitMQ 在一个 TCP 上面建立成百上千的信道来达到多个线程处理。

在客户端的每个连接里,可建立多个 Channel,每个 Channel 代表一个会话任务

Ps:一个TCP 被多个线程共享,每个线程对应一个信道,信道在 RabbitMQ 都有唯一的 ID,保证了信道的私有性,对应上唯一的线程使用。

Ps:RabbitMQ 需要使用信道,而不是直接进行 TCP 通信的原因:TCP的创建开销很大,创建需要三次握手,销毁需要四次握手。而且 TCP 可以被多个线程共享,显然线程比 TCP 要省事的多。