-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Q10Viking
committed
Mar 25, 2024
1 parent
81f7cb4
commit ecec041
Showing
7 changed files
with
119 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
--- | ||
sidebarDepth: 3 | ||
sidebar: auto | ||
prev: | ||
text: Back To 目录 | ||
link: /rabbitmq/ | ||
typora-root-url: ..\.vuepress\public | ||
--- | ||
|
||
|
||
|
||
|
||
|
||
RabbitMQ 支持两种主要类型的集群:普通集群(Classic Cluster)和镜像集群(Mirrored Cluster)。他们之间有一些重要的区别: | ||
|
||
- **普通集群**: 这种模式使用Erlang语言天生具备的集群方式搭建。这种集群模式下,集群的各个节点之间只会有相同的元数据,即队列结构,而消息不会进行冗余,只存在一个节点中。消费时,如果消费的不是存有数据的节点, RabbitMQ会临时在节点之间进行数据传输,将消息从存有数据的节点传输到消费的节点。很显然,这种集群模式的消息可靠性不是很高。因为如果其中有个节点服务宕机了,那这个节点上的数据就无法消费了,需要等到这个节点服务恢复后才能消费,而这时,消费者端已经消费过的消息就有可能给不了服务端正确应答,服务起来后,就会再次消费这些消息,造成这部分消息重复消费。 另外,如果消息没有做持久化,重启就消息就会丢失。并且,这种集群模式也不支持高可用,即当某一个节点服务挂了后,需要手动重启服务,才能保证这一部分消息能正常消费。所以这种集群模式只适合一些对消息安全性不是很高的场景。而在使用这种模式时,消费者应该尽量的连接上每一个节点,减少消息在集群中的传输。 | ||
- **镜像集群**:这种模式是在普通集群模式基础上的一种增强方案,这也就是RabbitMQ的官方HA高可用方案。需要在搭建了普通集群之后再补充搭建。其本质区别在于,**这种模式会在镜像节点中间主动进行消息同步,而不是在客户端拉取消息时临时同步**。并且在集群**内部有一个算法会选举产生master和slave,当一个master挂了后,也会自动选出一个来**。从而给整个集群提供高可用能力。这种模式的消息可靠性更高,因为每个节点上都存着全量的消息。而他的弊端也是明显的,集群内部的网络带宽会被这种同步通讯大量的消耗,进而降低整个集群的性能。这种模式下,队列数量最好不要过多 | ||
|
||
总的来说,普通集群适用于对性能要求高,但可以接受数据丢失的情况。而镜像集群则适用于对数据持久性和可用性有更高要求,并愿意付出一些性能代价的场景。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
--- | ||
sidebarDepth: 3 | ||
sidebar: auto | ||
prev: | ||
text: Back To 目录 | ||
link: /rabbitmq/ | ||
typora-root-url: ..\.vuepress\public | ||
--- | ||
|
||
|
||
|
||
RabbitMQ 支持多种交换机(Exchange)类型,每种类型都用于不同的消息路由和分发策略: | ||
|
||
## Direct Exchange(直连交换机) | ||
|
||
这种交换机根据消息的路由键(Routing Key)将消息发送到与之完全匹配的队列。只有当消息的路由键与队列绑定时指定的路由键完全相同时,消息才会被路由到队列。这是一种简单的路由策略,适用于点对点通信。 | ||
|
||
路由键与队列名完全匹配交换机,此种类型交换机,通过RoutingKey路由键将交换机和队列进行绑定, 消息被发送到exchange时,需要根据消息的RoutingKey,来进行匹配,只将消息发送到完全匹配到此RoutingKey的队列。 | ||
|
||
比如:如果一个队列绑定到交换机要求路由键为“key”,则只转发RoutingKey标记为“key”的消息,不会转发"key1",也不会转发“key.1”等等。它是完全匹配、单播的模式 | ||
|
||
![image-20240325161509202](/images/MySQL/image-20240325161509202.png) | ||
|
||
比如:如果一个队列绑定到交换机要求路由键为“key”,则只转发RoutingKey标记为“key”的消息,不会转发"key1",也不会转发“key.1”等等。它是完全匹配、单播的模式 | ||
|
||
同一个key可以绑定多个queue队列;当匹配到key1时,queue1和queue2都可以收到消息 | ||
|
||
## Topic Exchange(主题交换机) | ||
|
||
这种交换机根据消息的路由键与队列绑定时指定的路由键模式(通配符)匹配程度,将消息路由到一个或多个队列。路由键可以使用通配符符号 \*(匹配一个单词)和 #(匹配零个或多个单词),允许更灵活的消息路由。用于发布/订阅模式和复杂的消息路由需求。 | ||
|
||
Topic,主题类型交换机,此种交换机与Direct类似,也是需要通过routingkey路由键进行匹配分发,**区别在于Topic可以进行模糊匹配,Direct是完全匹配**。 | ||
|
||
1. Topic中,将routingkey通过"."来分为多个部分 | ||
2. "*":代表一个部分 | ||
3. "#":代表0个或多个部分(如果绑定的路由键为 "#" 时,则接受所有消息,因为路由键所有都匹配) | ||
|
||
![image-20240325161638575](/images/MySQL/image-20240325161638575.png) | ||
|
||
然后发送一条信息,routingkey为"key1.key2.key3.key4",那么根据"."将这个路由键分为了4个部分,此条路由键,将会匹配: | ||
|
||
1. key1.key2.key3.*:成功匹配,因为 * 可以代表一个部分 | ||
2. key1.# :成功匹配,因为#可以代表0或多个部分 | ||
3. *.key2.*.key4: 成功匹配,因为第一和第三部分分别为key1和key3,且为4个部分,刚好匹配 | ||
4. \#.key3.key4:成功匹配,#可以代表多个部分,正好匹配中了我们的key1和key2 | ||
|
||
如果发送消息routingkey为"key1",那么将只能匹配中key1.#,#可以代表0个部分 | ||
|
||
|
||
|
||
## Headers Exchange | ||
|
||
这种交换机根据消息的标头信息(Headers)来决定消息的路由,而不是使用路由键。队列和交换机之间的绑定规则是根据标头键值对来定义的,只有当消息的标头与绑定规则完全匹配时,消息才会被路由到队列。适用于需要复杂消息匹配的场景。 | ||
|
||
headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了 | ||
|
||
消费方指定的headers中必须包含一个"x-match"的键。 | ||
|
||
键"x-match"的值有2个 | ||
|
||
1. x-match = all :表示所有的键值对都匹配才能接受到消息 | ||
2. x-match = any :表示只要有键值对匹配就能接受到消息 | ||
|
||
![image-20240325161813649](/images/MySQL/image-20240325161813649.png) | ||
|
||
发送消息时间,如果其他参数信息是{ "name":"xiaomingXX", "sex":"男" },因为queue2的x-match是any,只需要有一个键值对匹配所以就能接收到消息,所以queue2可以接收到消息;queue1的x-match是all,需要所有的键值对都匹配才能接收到消息,所以此时queue1接收不到消息 | ||
|
||
## Fanout Exchange(广播交换机) | ||
|
||
这种交换机将消息广播到与之绑定的所有队列,无论消息的路由键是什么。用于发布/订阅模式,其中一个消息被广播给所有订阅者。 | ||
|
||
Fanout,扇出类型交换机,此种交换机,会将消息分发给所有绑定了此交换机的队列,**此时RoutingKey参数无效** | ||
|
||
![image-20240325161914834](/images/MySQL/image-20240325161914834.png) | ||
|
||
fanout类型交换机下发送消息一条,无论RoutingKey是什么,queue1,queue2,queue3,queue4都可以收到消息 | ||
|
||
## Default Exchange | ||
|
||
这是 RabbitMQ 默认实现的一种交换机,它不需要手动创建。当消息发布到默认交换机时,路由键会被解释为队列的名称,消息会被路由到与路由键名称相同的队列。默认交换机通常用于点对点通信,但不支持复杂的路由策略。 |