RabittMQ概述

RabittMQ概述RabbitMQ 2007 年发布 是一套开源 MPL 的消息队列服务软件 erlang 语 开发的开源消息队列系统 是由 LShift 提供的一个 AMQP Advanced Message Queuing Protocol 协议来

大家好,欢迎来到IT知识分享网。

RabbitMQ 2007 年发布,是一套开源(MPL)的消息队列服务软件,⽤ erlang 语⾔开发的开源消息队列系统,是由 LShift 提供的一个 AMQP(Advanced Message Queuing Protocol) 协议来实现。支持多种客户端,如:PythonJava、Ruby、C#、JavaScript、Go、Swift等。它是一种应用程序之间的通信方法,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,适用于各种企业级应用场景。

RabbitMQ 拥有数万名用户,是最受欢迎的开源消息代理之一,RabittMQ有六大特性分别是如下图,官网地址:https://www.rabbitmq.com/#features

RabittMQ概述

RabittMQ工作原理

RabittMQ协议模型由三部分组成:生成者、消费者、服务端,执行流程

1、生产者连接到Broker端,建立一个链接(Connection),开启一个通道(Channel)

2、生产者声明交换器和队列,设置相关属性,并通过路由减将交换器(Exchange)和队列(Queue)进行绑定。

3、消费者链接到Broker端,建立一个链接(Connection),开启一个通道(Channel),便于接收消息进行消费。

4、生产者发送消息,将消息发哦是那个到服务端(Broker)虚拟主机(Virtual host)的交换器上(Exchange)

5、虚拟主机(Virtual host)的交换器根据路由件的规则,发送到不同的绑定队列(Queue)

6、订阅了消息队列的消费者就可以获取消息进行消费。

如下图RabittMQ的架构图

RabittMQ概述

基本概念

Producer:

消息的生产者,也是一个向交换器发布消息的客户端应用程序。

Connect:

网络链接,一个TCP链接,即producer / consumer和 broker之间的TCP连接。

Channel:

它是 RabbitMQ 与客户端之间的通信接口。每个 channel 都是一个独立的连接,可以用于发送和接收消息。信道是建立在真实的 TCP 连接之上的虚拟链接。信道允许复用一条 TCP 连接,从而降低了建立和销毁 TCP 连接的开销。如果每次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP 连接的开销将是巨大的,效率较低。而信道是在 Connection 内部建立的逻辑连接,每个线程可以单独创建 Channel 进行通讯。AMQP method 包含了 channel id,帮助客户端和消息代理识别 Channel,因此 Channel 之间是完全隔离的。通过使用信道,作为轻量级 Connection 的 Channel 极大减少了操作系统建立 TCP 连接的开销,从而提高了效率。

Broker:

RabittMQ server ,标识消息队列服务器实体,它负责接收、路由和转发消息RabbitMQ 服务器可以配置为使用多个 Broker,这使得你可以将消息路由到不同的 Broker。

Virturl Host:

虚拟主机是 RabbitMQ 中的一种逻辑划分方式,它允许你在同一个 RabbitMQ 实例中创建多个独立的消息路由环境。

RabbitMQ 的默认主机会启动一个名为 ‘localhost’ 的默认虚拟主机。在该虚拟主机下,你可以创建任意数量的交换器(Exchange)和队列(Queue)。

在启动一个或多个自定义虚拟主机之后,你可以在该虚拟主机下创建交换器、队列、发布者、订阅者等。RabbitMQ 允许你在多个虚拟主机之间进行消息路由。例如,你可以在一个虚拟主机上发布一条消息,该消息被发送到另一个虚拟主机上的队列。

每个虚拟主机都使用独立的名称空间,这意味着你可以在同一台 RabbitMQ 服务器上运行多个独立的消息系统,而不会发生命名冲突。

Exchange:

Exchange 是消息中间件中的一种消息交换机,用于在消息发送时决定消息的路由方Exchange 可以根据消息的键(key)或消息的属性来决定消息的路由,从而实现消息的灵活转发。交换器用于转发消息,它不会存储消息 ,如果没有 Queue绑定到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。Exchange 可以分为以下几种类型:

  • Direct:直接交换,消息被直接发送到绑定它的队列上。
  • Topic:主题交换,消息被发送到绑定它的队列上,该队列匹配所有以特定字符串开头的消息。
  • Fanout:广播交换,消息被发送到绑定它的所有队列上。
  • Headers:头部交换,消息被发送到绑定它的队列上,该队列匹配所有具有特定头部属性的消息。

在 RabbitMQ 中,Exchange 和 Queue 之间可以通过 Binding Key 进行绑定,从而实现消息的路由和转发。Binding Key 是一个字符串,用于标识交换机的绑定关系。RabbitMQ 还支持多种路由策略,包括散列、路由、最大长度限制、最少活跃等等,可以根据实际需求进行选择和配置。

Queue:

队列是消息服务器中的一种数据结构,用于存储消息并在指定的路由键上等待接收者,一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将消息取走。需要注意,当多个消费者订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,每一条消息只能被一个订阅者接收。RabittMQ中,队列是消息服务器的一部分,用于实现消息的存储和传输。队列具有以下特点:

1. 队列是一种数据结构,用于存储消息并在指定的路由键上等待接收者。

2. 队列可以存储任意数量的消息,并且消息的顺序是按照它们被添加到队列的顺序进行排序的。

3. 队列具有一个唯一的标识符,用于在消息服务器上查找它。

4. 队列可以分布在多个节点上,以实现负载均衡和容错。

5. 队列可以被订阅者订阅,以便在有新消息到达时接收它们。

6. 队列可以具有不同的属性,例如持久性、副本数、队列类型等。

Binding:

绑定是连接 Queue 和 Exchange 的桥梁,用于实现消息的路由和转发。Binding 是在 Queue 和 Exchange 之间建立的一种关联关系,通过指定相同的 Binding Key,可以将消息从 Exchange 发送到相应的 Queue。,所以可以将交换器理解成一个由Binding构成的路由表。在 RabbitMQ 中,Binding 可以分为以下几种类型:

  • Direct Binding:直接绑定,即 Queue 和 Exchange 使用相同的 Binding Key 进行绑定。当消息从 Exchange 发送到该 Binding Key 时,将直接发送到对应的 Queue。
  • Topic Binding:主题绑定,即 Queue 和 Exchange 使用相同的 Binding Key 进行绑定,但消息的路由规则是基于消息的键(key)进行匹配。当消息的键匹配到该 Binding Key 时,将发送到对应的 Queue。
  • Fanout Binding:广播绑定,即 Queue 和 Exchange 使用相同的 Binding Key 进行绑定,但消息的路由规则是基于所有绑定的 Queue 进行广播。当消息从 Exchange 发送到该 Binding Key 时,将发送到所有绑定的 Queue。
  • headers Binding:头部绑定,即 Queue 和 Exchange 使用相同的 Binding Key 进行绑定,但消息的路由规则是基于消息的头部属性进行匹配。当消息的头部属性匹配到该 Binding Key 时,将发送到对应的 Queue。

Binding 的作用是实现消息的灵活路由和转发,使得消息能够根据不同的规则被发送到不同的队列或路由到不同的交换机进行处理。通过使用 Binding,可以实现复杂的消息传递模型,满足不同场景下的需求。

Binding Key(绑定键):

Binding Key 是一个字符串,用于Exchange和Queue的绑定关系,用于匹配Routing Key。最大长度255 字节。当一个队列和一个交换机通过 Binding Key 进行绑定时,消息将根据绑定关系进行路由和转发。

Routing Key(路由键)

消息头的一个属性,用于标记消息的路由规则,决定了交换机的转发路径。最大长度255 字节。每个消息都有一个默认的 Routing Key,这个默认的 Routing Key 是消息的完整路径(包括交换机和队列的名称)。

当消息被发送到 RabbitMQ 时,它将被路由到具有相同 Routing Key 的队列。如果多个队列具有相同的 Routing Key,则所有这些队列都将收到该消息。如果想要将消息路由到特定的队列,可以在发送消息时指定一个特定的 Routing Key。

Message:

消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,可以包含一个唯一的 ID,用于标识消息的身份。这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(消息可能需要持久性存储[消息的路由模式])等。

RabittMQ的常用交换器

RabbitMQ 交换器是用于将消息路由到目标队列的组件,常⽤的交换器类型有 direct(默认)、topic、fanout、headers(不推荐) 四种。注意:fanout、topic交换器是没有历史数据的,也就是说对于中途创建的队列,获取不到之前的消息。

1. 直接交换器(Direct Exchange):

直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。

这样当一个交换机绑定多个队列,就会被送到对应的队列去处理举例:如果一个队列绑定到该交换机上要求路由键 “abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。

RabittMQ概述

RabittMQ概述

扇形交换器(Fanout Exchange):

fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,所以此时routing key是不起作用的。所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

RabittMQ概述

主题交换器(Topic Exchange)

Topic,主题类型交换机,此种交换机与Direct类似,也是需要通过routingkey路由键进行匹配分发,区别在于Topic可以进行模糊匹配,Direct是完全匹配,Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.order

Bingding键又两种特殊通配符规则:

#:匹配0个或者多个单词词。

*:刚好可以匹配一个单词

RabittMQ概述

Topic型交换器比较强大跟其它交换器很相似。当一个队列以”#”作为绑定键时,它将接收所有消息,而不管路由键如何,类似于fanout型交换器。当特殊字符”*”、”#”没有用到绑定时,topic型交换器就好比direct型交换器了。

首部交换器(Headers Exchange):

首部交换器用于根据消息头中的属性进行路由,不处理路由键(routingKey)当一个消息被发送到首部交换器时,它会根据消息头中的属性与交换机(Exchange)上的所有队列进行匹配。如果找到了匹配的队列,则将消息发送到该队列;,headers交换器允许你匹配AMQP消息的header而非路由键,除此之外headers交换器和direct交换器完全一致,但性能却很差,几乎用不到。此种交换机不通过routingkey,但是通过headers进行绑定,也就是在声明binding绑定关系时,需要传入需要匹配的header的key/value键值对。

RabittMQ概述

如图,绑定关系中,需要指定”x-match”匹配类型:all:需要所有的key-value都匹配,才能匹配成功any:只需要其中一个key-value匹配,就匹配成功。

RabbitMQ的交换器介绍完了,下次介绍如何安装RabittMQ。

参考:https://www.cnblogs.com/zhaosq/p/13986350.html

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/109152.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信