Skip to content

Commit

Permalink
RabbitMQ + 1
Browse files Browse the repository at this point in the history
  • Loading branch information
Q10Viking committed Mar 25, 2024
1 parent 81f7cb4 commit ecec041
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 0 deletions.
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.
20 changes: 20 additions & 0 deletions docs/rabbitmq/01 RabbitMQ概述.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,31 @@ prev:
typora-root-url: ..\.vuepress\public
---

## 什么是 RabbitMQ?有什么显著的特点?

RabbitMQ 是一个开源的消息中间件,使用 Erlang 语言开发。这种语言天生非常适合分布式场景,RabbitMQ 也就非常适用于在分布式应用程序之间传递消息。RabbitMQ 有非常多显著的特点:

1. **消息传递模式**:RabbitMQ 支持多种消息传递模式,包括发布/订阅、点对点和工作队列等,使其更灵活适用于各种消息通信场景。
2. **消息路由和交换机**:RabbitMQ 引入了交换机(Exchange)的概念,用于将消息路由到一个或多个队列。这允许根据消息的内容、标签或路由键进行灵活的消息路由,从而实现更复杂的消息传递逻辑。
3. **消息确认机制**:RabbitMQ 支持消息确认机制,消费者可以确认已成功处理消息。这确保了消息不会在传递后被重复消费,增加了消息的可靠性。
4. **可扩展性**:RabbitMQ 是高度可扩展的,可以通过添加更多的节点和集群来增加吞吐量和可用性。这使得 RabbitMQ 适用于大规模的分布式系统。
5. **多种编程语言支持**:RabbitMQ 提供了多种客户端库和插件,支持多种编程语言,包括 Java、Python、Ruby、Node.js 等,使其在不同技术栈中都能方便地集成和使用。
6. **消息持久性**:RabbitMQ 允许消息和队列的持久性设置,确保消息在 RabbitMQ 重新启动后不会丢失。这对于关键的业务消息非常重要。
7. **灵活的插件系统**:RabbitMQ 具有丰富的插件系统,使其可以扩展功能,包括管理插件、数据复制插件、分布式部署插件等。
8. **管理界面**:RabbitMQ 提供了一个易于使用的 Web 管理界面,用于监视和管理队列、交换机、连接和用户权限等。

## AMQP

AMQP,即 **Advanced Message Queuing Protocol**(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为**面向消息的中间件设计****基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制**

![image-20211030173159114](/images/RabbitMQ/image-20211030173159114.png)

RabbitMQ 和 AMQP 有着非常密切的关系,但是他们是属于完全不同的两个概念。

- AMQP: AMQP 不是一个具体的消息中间件产品,而是一个协议规范。他是一个开放的消息产地协议,是一种应用层的标准协议,为面向消息的中间件设计。AMQP 提供了一种统一的消息服务,使得不同程序之间可以通过消息队列进行通信。 SpringBoot 框架默认就提供了对 AMQP 协议的支持。
- RabbitMQ:RabbitMQ则是一个开源的消息中间件,是一个具体的软件产品。RabbitMQ 使用 AMQP 协议来实现消息传递的标准,但其实他也支持其他消息传递协议,如 STOMP 和 MQTT。RabbitMQ 基于 AMQP 协议定义的消息格式和交互流程,实现了消息在生产者、交换机、队列之间的传递和处理。

总之,AMQP 本质上是一个开放的标准,他不光可以被 RabbitMQ 实现,也可以被其他产品实现。通过这种标准的协议,实际上是可以在不同的消息中间件系统之间进行灵活的消息传递。只不过,目前具体实现这种标准的产品目前并不多,RabbitMQ 则是最有影响力的一个产品。因此,RabbitMQ 成了 AMQP 协议事实上的代表。**SpringBoot 框架默认提供的 AMQP 协议支持底层也是基于 RabbitMQ 产品实现的**

## RabbitMQ介绍

Expand Down Expand Up @@ -45,3 +63,5 @@ RabbitMQ 提供了 6 种工作模式:简单模式、work queues、Publish/Subs

![image-20210422225026111](/images/RabbitMQ/image-20210422225026111.png)



19 changes: 19 additions & 0 deletions docs/rabbitmq/21 RabbitMQ集群.md
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挂了后,也会自动选出一个来**。从而给整个集群提供高可用能力。这种模式的消息可靠性更高,因为每个节点上都存着全量的消息。而他的弊端也是明显的,集群内部的网络带宽会被这种同步通讯大量的消耗,进而降低整个集群的性能。这种模式下,队列数量最好不要过多

总的来说,普通集群适用于对性能要求高,但可以接受数据丢失的情况。而镜像集群则适用于对数据持久性和可用性有更高要求,并愿意付出一些性能代价的场景。
80 changes: 80 additions & 0 deletions docs/rabbitmq/22 有几种交换机类型.md
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 默认实现的一种交换机,它不需要手动创建。当消息发布到默认交换机时,路由键会被解释为队列的名称,消息会被路由到与路由键名称相同的队列。默认交换机通常用于点对点通信,但不支持复杂的路由策略。

0 comments on commit ecec041

Please sign in to comment.