RabbitMQ

发布于:2025-02-23 ⋅ 阅读:(15) ⋅ 点赞:(0)

https://www.rabbitmq.com/

RabbitMQ(基于AMQP协议,erlang语言开发,稳定性好)

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,集群和故障转移是构建在开放电信平台框架上。所有主要的编程语言均有与代理接口通讯的客户端

目录

RabbitMQ相关概念

Broker

Message(消息)

Exchange

Queue

Binding(绑定关系)

Routing Key(路由键)

Virtual Host

Producer

Consumer

Connection

Channel

交换机(Exchange)类型

Default Exchange

Direct Exchange

Fanout Exchange

Topic Exchange

Headers Exchange

交换机类型与路由键

AMQP(Advanced Message Queuing Protocol)模型

RabbitMQ消息流转模型

RabbitMQ的工作模式(消息模式)

Simple模式(简单模式队列,即最简单的收发模式)

Work Queues(工作序列,资源的竞争)

Publish/Subscribe(发布订阅,共享资源)

Routing(路由模式) 

Topics(主题模式/通配符模式,路由模式的一种) 

RPC(‌RPC模式)

Publisher Confirms(发布确认模式/发布者确认模式) 


RabbitMQ相关概念

Broker

       在 RabbitMQ 中,Broker 是 RabbitMQ 服务器本身。RabbitMQ 服务器,负责接收和分发消息。简单来说就是消息队列服务器实体

Message(消息)

       消息是 RabbitMQ 中传递的基本数据单元。

Exchange

       消息交换机,它指定消息按什么规则,路由到那个队列

       交换机是消息的中转站,用于接收生产者发送的消息,并根据特定的路由规则将这些消息转发到一个或多个队列中。RabbitMQ提供了多种不同类型的交换机,每种类型的交换机都有不同的消息路由规则。

Queue

        消息队列载体,每个消息都会被投入到一个或多个队列。

        队列是存储消息的地方,消息会按照先进先出的顺序被消费。每个队列都有一个唯一的名称。消息从交换机路由到队列,然后等待消费者来获取和处理。

        Queue是实际保存数据的最小单位。Queue不需要Exchange也可以独立工作,只不过通常在业务场景中,会增加Exchange实现更复杂的消息分配策略。Queue结构天生就具有FIFO的顺序,消息最终都会被分发到不同的Queue当中,然后才被消费者进行消费处理。最为常用的是经典队列Classic

Binding(绑定关系

        绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

        Binding是Exchange和Queue之间的关联规则,定义了消息如何从交换机路由到特定的队列。

Routing Key(路由键)

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

       路由键是一个字符串,生产者在发送消息时指定该字符串,RabbitMQ 根据这个字符串交换机的类型将消息路由到适当的队列。

Virtual Host

       虚拟主机,即RabbitMQ Server。其内部含有独立的queue,exchange和binding等,拥有独立的权限系统,可以做到Virtual Host范围的用户控制。从RabbitMQ的全局角度,Virtual Host可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同Virtual Host)。

        虚拟主机,是RabbitMQ中的逻辑容器,用于隔离不同环境或不同应用程序的信息流。每个虚拟主机都有自己的队列,交换机等设置,可以理解为一个独立的RabbitMQ服务。

Producer

       消息生产者,就是投递消息的程序。

        生产者负责发送消息到Exchange或者Queue。

Consumer

      消息消费者,就是接受消息的程序。

      消费者负责从Queue中订阅和处理消息。

Connection

       Connection连接,管理和维护与RabbitMQ服务器的TCP连接,生产者、消费者通过这个连接和Broker建立物理网络连接。

Channel

       消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

       Channel通道,是在Connection内创建的轻量级通信通道,用于进行消息的传输和交互。应用程序通过Channel进行消息的发送和接收。通常一个Connection可建立多个Channel。

交换机(Exchange)类型

       交换机用于接收生产者发送的消息,并根据特定的路由规则将这些消息转发到一个或多个队列。RabbitMQ提供了多种不同类型的交换机,主要类型有:

Default Exchange

        默认交换直接交换,没有由代理预先声明的名称(空字符串)。它有一个特殊属性,使其对于简单的应用程序非常有用:创建的每个队列都会自动使用与队列名称相同的路由键绑定到它。

       这是RabbitMQ默认实现的一种交换机,它不需要手动创建。当消息发布到默认交换机时,路由键会被解释为队列的名称,消息会被路由到与路由键名称相同的队列。默认交换机通常用于点对点通信,但不支持复杂的路由策略。

Direct Exchange

       根据精确的路由键将消息发送到队列。

       这种交换机根据消息的路由键(Routing Key)将消息发送到与之完全匹配的队列。只有当消息的路由键与队列绑定时指定的路由键完全相同时,消息才会被路由到队列。这是一种简单的路由策略,适用于点对点通信。

Fanout Exchange

     将消息广泛传播到所有绑定的队列。

     这种交换机将消息广播到与之绑定的所有队列,无论消息的路由键是什么。用于发布订/阅模式,其中一个消息被广播给所有订阅者。

Topic Exchange

       根据主题模式路由消息。支持复杂的路由键匹配。

       这种交换机根据消息的路由键与队列绑定时指定的路由键模式(通配符)匹配程度,将消息路由到一个或多个队列。路由键可以使用通配符符号*(匹配一个单词)和#(匹配零个或多个单词),允许更灵活的消息路由。用于发布/订阅模式和复杂的消息路由需求。

Headers Exchange

        根据消息头中的属性路由消息。

        这种交换机根据消息的标头信息(Headers)来决定消息的路由,而不是使用路由键。队列和交换机之间的绑定规则是根据标头键值对来定义的,只有当消息的标头与绑定规则完全匹配时,消息才会被路由到队列。适用于需要复杂消息匹配的场景。

交换机类型与路由键

  • Direct Exchange:路由键与队列的绑定键完全匹配时,消息会被路由到该队列。
  • Fanout Exchange:路由键被忽略,消息会被广播到所有绑定的队列。
  • Topic Exchange:路由键可以包含多个部分,使用点(.)分隔,允许进行模式匹配。例如,路由键 sports.football 可以匹配绑定键 sports.* 或 *.football。
  • Headers Exchange:路由键不是主要的路由方式,消息头中的属性用于路由。

AMQP(Advanced Message Queuing Protocol)模型

         AMQP-高级消息队列协议

RabbitMQ消息流转模型

RabbitMQ的工作模式消息模式

        RabbitMQ支持多种消息传递模式,这些模式允许应用程序在不同的场景下进行灵活的消息交流。如下:

Simple模式(简单模式队列,即最简单的收发模式)

 

       最直接的方式,P端发送一个消息到一个指定的Queue,中间不需要任何Exchange规则。C端按Queue方式进行消费。

Work Queues(工作序列资源的竞争)

        Producer将消息发送到Queue,多个Consumer同时消费Queue上的消息。消息会均匀的分配个多个Consumer处理。

        这种模式是最常用的模式

Publish/Subscribe(发布订阅,共享资源)

 

        Producer只负责将消息发送到Exchange交换机上。Exchange将消息转发到所有订阅的Queue,并由对应的Consumer去进行消费。

        适合场景: 消息需要被多个消费者同时接收的场景。如: 实时通知或者⼴播消息。

Routing(路由模式) 

       在发布订阅模式的基础上,增加一个Routing Key(路由键),并根据Routing Key判断Exchange将消息转发到哪些Queue上。指定Exchange如何将不同类别的消息分发到不同的Queue上

Topics(主题模式/通配符模式,路由模式的一种) 

       在路由模式的基础上,对Routing Key(路由键)增加了模糊匹配的功能。

       Topics和Routing的基本原理相同,即:⽣产者将消息发给交换机,交换机根据Routing Key将消息转发给与Routing Key匹配的队列. 类似于正则表达式的⽅式来定义Routing key的模式.

        * 代表一个具体的单词。# 代表0个或多个单词。

         适合场景: 需要灵活匹配和过滤消息的场景。

RPC(‌RPC模式)

        在‌RPC模式的过程中, 没有⽣产者和消费者, ⽐较像RPC远程过程调⽤, ⼤概就是通过两个队列实现了⼀个可回调的过程。适用于需要请求-响应机制的场景。 

Publisher Confirms(发布确认模式/发布者确认模式) 

       布者确认模式通过给发送者提供确认机制,来保证这个消息发送的过程是成功的。

       Publisher Confirms 模式是 RabbitMQ 提供的⼀种确保消息可靠发送到 RabbitMQ 服务器的机制。在这种模式下,⽣产者可以等待 RabbitMQ 服务器的确认,以确保消息已经被服务器接收并处理.

       通过 Publisher Confirms 模式,⽣产者可以确保消息被 RabbitMQ 服务器成功接收,从⽽避免消息丢失问题.

       发布确认是 RabbitMQ 对 AMQP协议的扩展,者确认模式默认是不开启的如果需要开启发布者确认模式,需要手动在channel中进行声明。发布者确认模式在通道级别使用以下confirmSelect方法启用:

        ⽣产者将 Channel 设置为 confirm(确认)模式(通过调⽤ channel.confirmSelect()完成)。

        使⽤发布确认机制, 必须要将信道设置成confirm(确认)模式。