Update RabbitMQ_基础.md

This commit is contained in:
heibaiying 2019-08-02 17:19:14 +08:00 committed by GitHub
parent ac36b7f7b8
commit 332230e3a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -36,25 +36,21 @@ AMQP (Advanced Message Queuing Protocol) 是一个提供统一消息服务的应
RabbitMQ 完全实现了 AMQP 协议并基于相同的模型架构。RabbitMQ 在实现 `AMQP 0-9-1` 的基础上还进行了额外拓展,并可以通过插件来支持 `AMQP 1.0`。所以在某种程度上而言, RabbitMQ 就是 AMQP 在 Erlang 语言上的实现。RabbitMQ 基于众多优秀的特性成为了目前最为广泛使用的消息中间件,它的主要特性如下: RabbitMQ 完全实现了 AMQP 协议并基于相同的模型架构。RabbitMQ 在实现 `AMQP 0-9-1` 的基础上还进行了额外拓展,并可以通过插件来支持 `AMQP 1.0`。所以在某种程度上而言, RabbitMQ 就是 AMQP 在 Erlang 语言上的实现。RabbitMQ 基于众多优秀的特性成为了目前最为广泛使用的消息中间件,它的主要特性如下:
- 支持多种消息传递协议,除了 AMQP 外,还可以通过插件支持所有版本的 STOMP 协议和 MQTT 3.1 协议; + 支持多种消息传递协议,除了 AMQP 外,还可以通过插件支持所有版本的 STOMP 协议和 MQTT 3.1 协议;
- 拥有丰富的交换器类型,可以满足绝大部分的使用需求; + 拥有丰富的交换器类型,可以满足绝大部分的使用需求;
- 支持多种部署方式,易于部署; + 支持多种部署方式,易于部署;
+ 支持跨语言开发Java.NETPHPPythonJavaScriptRubyGo
- 支持跨语言开发Java.NETPHPPythonJavaScriptRubyGo + 可以通过集群来实现高可用性和高吞吐,还可以通过 Federation 插件来连接跨机房跨区域的不同版本的服务节点;
+ 插拔式的身份验证和授权,支持 TLS 和 LDAP
- 可以通过集群来实现高可用性和高吞吐,还可以通过 Federation 插件来连接跨机房跨区域的不同版本的服务节点; + 支持持续集成,能够使用各种插件进行灵活地扩展;
+ 能够使用多种方式进行监控和管理,如 HTTP API命令行工具和 UI 界面。
- 插拔式的身份验证和授权,支持 TLS 和 LDAP
- 支持持续集成,能够使用各种插件进行灵活地扩展;
- 能够使用多种方式进行监控和管理,如 HTTP API命令行工具和 UI 界面。
## 四、模型架构 ## 四、模型架构
RabbitMQ 与 AMQP 遵循相同的模型架构,其架构示例图如下: RabbitMQ 与 AMQP 遵循相同的模型架构,其架构示例图如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-模型架构.png"/> </div> <div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-模型架构.png"/> </div>
### 1. Publisher发布者 ### 1. Publisher发布者
发布者 (或称为生产者) 负责生产消息并将其投递到指定的交换器上。 发布者 (或称为生产者) 负责生产消息并将其投递到指定的交换器上。
@ -99,7 +95,7 @@ RabbitMQ 采用类似 NIO (非阻塞式 IO ) 的设计,通过 Channel 来复
### 10. Virtual Host虚拟主机 ### 10. Virtual Host虚拟主机
RabbitMQ 支持多租户,并通过虚拟主机来实现逻辑分组和资源隔离,一个虚拟主机就是一个小型的 RabbitMQ 服务器,拥有独立的队列、交换器和绑定关系。用户可以按照不同业务场景建立不同的虚拟主机,虚拟主机之间是完全独立的,你无法将 vhost1 上的交换器与 vhost2 上的队列进行绑定,这可以极大的保证业务之间的隔离性和数据安全。默认的虚拟主机名为 `/` RabbitMQ 通过虚拟主机来实现逻辑分组和资源隔离,一个虚拟主机就是一个小型的 RabbitMQ 服务器,拥有独立的队列、交换器和绑定关系。用户可以按照不同业务场景建立不同的虚拟主机,虚拟主机之间是完全独立的,你无法将 vhost1 上的交换器与 vhost2 上的队列进行绑定,这可以极大的保证业务之间的隔离性和数据安全。默认的虚拟主机名为 `/`
### 11. Broker ### 11. Broker
@ -114,14 +110,17 @@ RabbitMQ 支持多种交换器类型,常用的有以下四种:
这是最简单的一种交换器模型,此时会把消息路由到与该交换器绑定的所有队列中。如下图,任何发送到 X 交换器上的消息,都会被路由到 Q1 和 Q2 两个队列上。 这是最简单的一种交换器模型,此时会把消息路由到与该交换器绑定的所有队列中。如下图,任何发送到 X 交换器上的消息,都会被路由到 Q1 和 Q2 两个队列上。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-fanout-exchange.png"/> </div> <div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-fanout-exchange.png"/> </div>
### 5.2 direct ### 5.2 direct
把消息路由到 BindingKey 和 RountingKey 完全一样的队列中。如下图,当消息的 RountingKey 为 orange 时,消息会被路由到 Q1 队列;当消息的 RountingKey 为 black 或 green 时,消息会被路由到 Q2 队列。 把消息路由到 BindingKey 和 RountingKey 完全一样的队列中。如下图,当消息的 RountingKey 为 orange 时,消息会被路由到 Q1 队列;当消息的 RountingKey 为 black 或 green 时,消息会被路由到 Q2 队列。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-direct-exchange.png"/> </div> <div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-direct-exchange.png"/> </div>
需要特别说明的是一个交换器绑定多个队列时,它们的 BindingKey 是可以相同的,如下图。此时当消息的 RountingKey 为 black 时,消息会同时被路由到 Q1 和 Q2 队列。 需要特别说明的是一个交换器绑定多个队列时,它们的 BindingKey 是可以相同的,如下图。此时当消息的 RountingKey 为 black 时,消息会同时被路由到 Q1 和 Q2 队列。
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-direct-exchange-2.png"/> </div> <div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-direct-exchange-2.png"/> </div>
### 5.3 topic ### 5.3 topic
将消息路由到 BindingKey 和 RountingKey 相匹配的队列中,匹配规则如下: 将消息路由到 BindingKey 和 RountingKey 相匹配的队列中,匹配规则如下:
@ -132,6 +131,7 @@ RabbitMQ 支持多种交换器类型,常用的有以下四种:
以下是官方文档中的示例,交换器与队列的绑定情况如图所示,此时的路由情况如下: 以下是官方文档中的示例,交换器与队列的绑定情况如图所示,此时的路由情况如下:
<div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-topic-exchange.png"/> </div> <div align="center"> <img src="https://github.com/heibaiying/Full-Stack-Notes/blob/master/pictures/rabbitmq-topic-exchange.png"/> </div>
+ 路由键为 `lazy.orange.elephant` 的消息会发送给所有队列; + 路由键为 `lazy.orange.elephant` 的消息会发送给所有队列;
+ 路由键为 `quick.orange.fox` 的消息只会发送给 Q1 队列; + 路由键为 `quick.orange.fox` 的消息只会发送给 Q1 队列;
+ 路由键为 `lazy.brown.fox` 的消息只会发送给 Q2 队列; + 路由键为 `lazy.brown.fox` 的消息只会发送给 Q2 队列;