【MQ】RabbitMQの概念紹介及び実行方法

发布时间 2023-11-28 14:40:28作者: 农民工024

参考URL:

<https://www.cnblogs.com/yy-cola/p/11089800.html>

<https://blog.csdn.net/qq_41097820/article/details/88793329>

■中心概念

Message

消息 消息是不具名的,它由消息头和消息体组成,消息体式不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指该消息可能需要持久性存储)等。

Publisher

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

Exchange

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。Exchange有4种类型:direct(默认)、fanout,topic,和headers,不同类型的Exchange转发消息的策略有所区别

Queue

消息队列 用来保存消息直到发送给消费者。它式消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

Binding

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

Connection

网络连接,比如一个TCP连接。

Channel

信道,多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是比较昂贵的开销,所以引入了信道的概念,以复用一条TCP连接

Consumer

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、消息交换器、绑定和权限机制。vhost是AMQP概念的基础,必须再连接时指定,RabbitMQ默认的vhost是”/”

Broker

表示消息队列服务器实体

(1)AMQP中的消息路由

AMQP中消息的路由过程是Java开发者熟悉的JMS存在一些差别,AMQP中增加了Exchange和Binding的角色。生产者把消息发布到Exchange上,消息最终到达队列并被消费者接收,而Binding决定交换器的消息应该发送到那个队列。

(2)Exchange类型

Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:

 direct、fanout,topic,headers。headers匹配AMQP消息的header而不是路由键,headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型;

 

■インストール紹介

(1)DockerでRabbitMQをインストールする。<https://blog.csdn.net/qq_41097820/article/details/88795336>

 (2)コマンド紹介

▶既存のイメージを確認

docker images

▶RabbitMQのイメージをPULLする("management":WEB管理画面を持つ)

docker pull rabbitmq:3-management

▶RabbitMQを実行

docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

 ※-p表示端口映射,5672端口是客户端和RabbitMQ及通信的接口,15672端口为管理界面访问web界面的端口。

▶管理画面へ入り

URL: <http://localhost:15672>

username: guest

password: guest

 ■RabbitMQの管理画面の操作紹介

(1)起動ログ

(2) 主画面

(3)Exchangesの追加

 (4)Queuesの追加

 (5)ExchangesとQueuesを紐づけ

①ExachangesのNameをクリックして、設定画面へ移動(lt.direct)

 

 

  (6)上記の内容により、Exchanges(fanout / topic / headers)が4つのQueuesを再度紐づけ。

 

 

 

 (7)メッセージの発送をテスト

①direct型(点<=>点(Exachangesから、Queuesへ))

▶メッセージの発送

 ▶メッセージの受け取り

 

 

② 散らす(fanout型)

▶メッセージの発送

 

 ▶メッセージのリスト

 ▷Queuesのリスト「Is」

▷Queuesのリスト「Is.news」

▷Queuesのリスト「Is.old」

 ▷Queuesのリスト「ww.news」

▶メッセージの読み取り結果

  (8)購読(topic型)

▶メッセージの発送

  ▶メッセージの受け取り

 

 ▷Is.news

 ▷ww.news

■ 補足

在RabbitMQ的Topic Exchange(主题交换器)中,通配符用于创建更灵活的Routing Key匹配规则。Topic Exchange支持两种通配符:星号(*)和井号(#)。

它们在Routing Key和队列的绑定键(Binding Key)中使用,以便根据特定的模式将消息路由到正确的队列。

  1. 星号(*):星号通配符用于匹配Routing Key中的一个单词。在这里,单词是指由点(.)分隔的字符串。例如,假设你有一个Routing Key为"user.created",你可以使用绑定键"user.*"来匹配这个Routing Key。这意味着,任何以"user."开头并且后面跟着一个单词的Routing Key都会被匹配。例如,"user.created"、"user.updated"等。

  2. 井号(#):井号通配符用于匹配Routing Key中的零个或多个单词。与星号类似,单词也是由点(.)分隔的字符串。例如,假设你有一个Routing Key为"user.created.admin",你可以使用绑定键"user.#"来匹配这个Routing Key。这意味着,任何以"user."开头的Routing Key都会被匹配,无论后面跟着多少个单词。例如,"user.created"、"user.updated.admin"、"user.deleted.superadmin"等。

使用通配符时,请注意以下几点:

  • 通配符必须与点(.)字符一起使用,例如"user.*"或"user.#"。
  • 通配符不能用于部分单词匹配,例如"user.creat*"是无效的。
  • 通配符可以在绑定键的开头、中间或结尾使用,例如".created"、"user..admin"或"user.#"。

 =======================================================================================================

Headers Exchange(头交换器)是RabbitMQ中一种特殊类型的Exchange,它不依赖于Routing Key来路由消息,而是根据消息的头部属性(headers)来进行匹配和路由。Headers Exchange允许你基于多个条件来路由消息,这使得它在某些场景下比基于Routing Key的Exchange更灵活。

在Headers Exchange中,队列的绑定键(Binding Key)实际上是一个由键值对组成的字典,这些键值对表示消息头部属性的匹配条件。当消息的头部属性满足这些匹配条件时,消息将被路由到相应的队列。

以下是使用Headers Exchange的一些关键概念和步骤:

  1. 创建Headers Exchange:首先,你需要创建一个类型为"headers"的Exchange。例如:

    channel.exchange_declare(exchange='my_headers_exchange', exchange_type='headers')
     
  2. 创建队列并绑定到Exchange:然后,你需要创建一个或多个队列,并将它们绑定到Headers Exchange。在绑定队列时,你需要提供一个字典作为绑定键,该字典包含消息头部属性的匹配条件。例如:

    channel.queue_declare(queue='my_queue') channel.queue_bind(queue='my_queue', exchange='my_headers_exchange', arguments={'header1': 'value1', 'header2': 'value2'})
     在这个例子中,我们将队列"my_queue"绑定到Headers Exchange,并指定绑定键为一个包含两个键值对的字典。这意味着,只有当消息的头部属性同时满足"header1"等于"value1"和"header2"等于"value2"这两个条件时,消息才会被路由到"my_queue"。
     
  3. 发布消息:当你发布消息时,你需要在消息的属性中设置headers字段。例如:

    channel.basic_publish(exchange='my_headers_exchange', routing_key='', body='Hello, Headers Exchange!', properties=pika.BasicProperties(headers={'header1': 'value1', 'header2': 'value2'}))
     在这个例子中,我们将消息发布到Headers Exchange,并设置消息的头部属性为与绑定键匹配的键值对。由于消息的头部属性满足绑定键的匹配条件,消息将被路由到"my_queue"。
     
  4. 匹配模式:Headers Exchange支持两种匹配模式,它们由"x-match"参数控制:

    • "all"(默认):消息的头部属性必须满足绑定键中的所有匹配条件,消息才会被路由到队列。例如,如果绑定键包含两个键值对,那么消息的头部属性必须同时满足这两个条件。
    • "any":消息的头部属性只需满足绑定键中的任意一个匹配条件,消息就会被路由到队列。例如,如果绑定键包含两个键值对,那么消息的头部属性只需满足其中一个条件。

    要设置匹配模式,你可以在绑定队列时将"x-match"参数添加到绑定键字典中。例如:

    channel.queue_bind(queue='my_queue', exchange='my_headers_exchange', arguments={'x-match': 'any', 'header1': 'value1', 'header2': 'value2'}) 

    在这个例子中,我们将匹配模式设置为"any",这意味着只要消息的头部属性满足"header1"等于"value1"或"header2"等于"value2"其中一个条件,消息就会被路由到"my_queue"。