11## rabbitmq
2- [ 信道,交换机,队列] ( https://www.cnblogs.com/zhangxue/p/7699698.html )
32
4- [ 概念] ( https://www.cnblogs.com/jun-ma/p/4840869.html )
3+ ### RabbitMQ 是什么?它的核心组件有哪些?**
4+ RabbitMQ 是一个基于 ** AMQP(Advanced Message Queuing Protocol)** 协议的消息队列中间件,具有高可靠性、持久化存储和灵活的路由机制。
55
6- [ 教程] ( https://github.com/rabbitmq/rabbitmq-tutorials )
7-
8- [ queue参数] ( https://www.cnblogs.com/LiangSW/p/6218886.html )
9-
10- [ go] ( https://blog.csdn.net/smile_YangYue/article/details/80709427 )
11-
12- ### 概念:
13-
14-
15- Broker:简单来说就是消息队列服务器实体。
16-
17- Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
18- 种类:direct 1:1 完全匹配 fanout 1: n 1条消息发送到绑定到的队列 topic n:1 n条消息根据模糊匹配,发送到一个队列
19-
20-
21- Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
22-
23- Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
24-
25- Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
26-
27- vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
28-
29- producer:消息生产者,就是投递消息的程序。
30-
31- consumer:消息消费者,就是接受消息的程序。
32-
33- channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
6+ ** RabbitMQ 的核心组件:**
7+ - ** Producer(生产者):** 负责发送消息到 RabbitMQ。
8+ - ** Exchange(交换机):** 接收生产者的消息,并根据路由规则分发到队列。
9+ - ** Queue(队列):** 存储消息,等待消费者消费。
10+ - ** Consumer(消费者):** 从队列中取出消息并处理。
11+ - ** Binding(绑定):** 连接队列和交换机,定义路由规则。
12+ - ** Routing Key(路由键):** 生产者发送消息时附带的关键字,影响消息的投递方式。
13+ - ** Virtual Host(虚拟主机):** 类似于命名空间,用于隔离不同的应用或租户。
3414
3515
3616### 使用过程:
4727
4828exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
4929
30+ ### ** RabbitMQ 与 Kafka 的区别是什么?**
31+ | ** 对比项** | ** RabbitMQ** | ** Kafka** |
32+ | -------------| -------------| ----------|
33+ | ** 消息协议** | AMQP | 自定义协议 |
34+ | ** 数据存储** | 内存+磁盘存储 | 仅磁盘存储 |
35+ | ** 消息模式** | ** Push** | ** Pull** |
36+ | ** 吞吐量** | 低(万级) | 高(百万级) |
37+ | ** 消息顺序** | 队列级别保证顺序 | 分区级别保证顺序 |
38+ | ** 事务支持** | 支持事务 | 不支持事务 |
39+ | ** 典型应用** | 订单、任务调度 | 日志采集、大数据处理 |
40+
41+ ### ** RabbitMQ 如何保证消息不丢失?**
42+ 1 . ** 生产者端**
43+ - 开启 ** 消息持久化** (` delivery_mode=2 ` )。
44+ - 使用 ** Publisher Confirms** 机制,确保消息成功投递到交换机。
45+ 2 . ** RabbitMQ 服务器**
46+ - 队列持久化(` durable=true ` ),避免 RabbitMQ 宕机导致数据丢失。
47+ - 开启 ** 高可用模式** (镜像队列)。
48+ - 开启 ** 磁盘持久化** ,确保消息写入磁盘。
49+ 3 . ** 消费者端**
50+ - ** ACK 确认机制** (` manual_ack=true ` ),确保消息被成功处理后才从队列删除。
51+ - 处理失败时,** 拒绝并重新入队** (` basic.reject ` 或 ` basic.nack ` )。
52+
53+ ### ** RabbitMQ 如何保证消息顺序?**
54+ - ** 单一队列消费** :单一消费者顺序消费,确保 FIFO(适用于低并发)。
55+ - ** 严格保证多消费者顺序**
56+ - 将消息 ** 按 key 进行分片** ,使用多个队列,每个队列一个消费者。
57+ - 在业务层 ** 排序合并** 处理结果。
58+
59+
60+ ### ** RabbitMQ 的镜像队列(HA 队列)是什么?**
61+ - ** RabbitMQ 镜像队列** :在多个节点上复制队列,保证高可用。
62+ - ** 如何启用?**
63+ - 配置 ** policy** :
64+ ``` sh
65+ rabbitmqctl set_policy ha-all " ^queue_name" ' {"ha-mode":"all"}'
66+ ```
67+ - ** 优缺点**
68+ - ** 优点** :避免单点故障,RabbitMQ 宕机不会丢失数据。
69+ - ** 缺点** :同步数据增加网络和存储开销。
70+
71+ # ## **如何优化 RabbitMQ 的性能?**
72+ 1. ** 生产者优化**
73+ - ** 批量发布** (` batch.publish` ),减少网络 I/O 开销。
74+ - ** 消息压缩** (gzip/snappy),减少数据传输量。
75+ 2. ** 队列优化**
76+ - ** 多个队列并行** ,避免单个队列成为性能瓶颈。
77+ - ** 合理使用 TTL(消息过期时间)** ,防止积压。
78+ 3. ** 消费者优化**
79+ - ** 并发消费** ,使用多个 Channel 处理消息。
80+ - ** 预取消息(Prefetch Count)** ,减少消费者等待时间:
81+ ` ` ` sh
82+ channel.basic_qos(prefetch_count=10)
83+ ` ` `
84+
85+ # ## **RabbitMQ 如何处理消息堆积?**
86+ 1. ** 短期优化**
87+ - ** 增加消费者数量** ,提高消费速度。
88+ - ** 降低生产速率** ,避免消息继续堆积。
89+ 2. ** 长期优化**
90+ - ** 拆分队列** ,使用多个队列并行处理不同的消息类型。
91+ - ** 限流** ,RabbitMQ 提供 ** prefetch** 机制,防止消费者超载:
92+ ` ` ` sh
93+ channel.basic_qos(prefetch_count=100)
94+ ` ` `
95+ - ** 增加 RabbitMQ 节点** ,进行集群扩展。
96+
97+ # **死信队列(Dead Letter Queue,DLQ)**
98+
99+ 死信队列(DLQ)是一个特殊的队列,用于存储无法正常消费的消息。消息进入死信队列通常由以下原因导致:
100+
101+ 1. ** 消息过期** :消息在队列中存活时间超过 TTL(Time-To-Live)后自动进入死信队列。
102+ 2. ** 队列满** :消息无法被消费且队列已满,无法再接收新消息。
103+ 3. ** 消费者拒绝消息** :消费者处理消息失败,且未进行 ` ack` 确认。
104+ 4. ** 队列未绑定** :消息发送到的队列无消费者。
105+
106+ 死信队列用于后续的故障排查、重试处理或人工干预,防止消息丢失。
107+
108+
109+
110+ # ## **RabbitMQ 的消息投递模式有哪些?**
111+ RabbitMQ 提供了 4 种常见的消息投递模式:
112+ 1. ** Direct(直连交换机)**
113+ - 只有 Routing Key 完全匹配的队列才能收到消息。
114+ 2. ** Fanout(广播模式)**
115+ - 消息发送到交换机后,所有绑定的队列都能收到消息(不需要 Routing Key)。
116+ 3. ** Topic(主题模式)**
117+ - Routing Key 支持通配符(` * ` 表示一个单词,` # ` 表示多个单词)。
118+ 4. ** Headers(头部交换机)**
119+ - 根据消息头部属性(Headers)匹配队列,而不是 Routing Key。
120+
50121# ## 模式
51122
52123[详细的图](http://www.rabbitmq.com/getstarted.html)
@@ -59,3 +130,9 @@ exchange接收到消息后,就根据消息的key和已经设置的binding,
59130 1. direct
60131 2. fanout
61132 3. topic
133+
134+ # ## 扩容
135+ - 默认不支持自动扩容,手动加节点扩容。
136+ - 可使用Kubernetes,底层通过负载均衡和节点池管理实现扩容。
137+ - 采用 ** 多个队列** ,不同队列存放不同的消息类型。
138+
0 commit comments