Skip to content

Commit 77cbb09

Browse files
committed
update
1 parent 8b1e07d commit 77cbb09

13 files changed

+975
-857
lines changed

README.md

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,20 @@
2020
- [并发](#%E5%B9%B6%E5%8F%91)
2121
- [JVM](#jvm)
2222
- [数据库](#%E6%95%B0%E6%8D%AE%E5%BA%93)
23-
- [Redis](#redis)
23+
- [MySQL](#mysql)
24+
- [Redis](#redis)
2425
- [框架](#%E6%A1%86%E6%9E%B6)
2526
- [Spring](#spring)
2627
- [Spring Boot](#spring-boot)
2728
- [Spring MVC](#spring-mvc)
2829
- [Mybatis](#mybatis)
2930
- [SpringCloud](#springcloud)
3031
- [Netty](#netty)
32+
- [消息队列](#%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97)
33+
- [RabbitMQ](#rabbitmq)
34+
- [算法](#%E7%AE%97%E6%B3%95)
35+
- [网络](#%E7%BD%91%E7%BB%9C)
36+
- [设计模式](#%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F)
3137
- [工具](#%E5%B7%A5%E5%85%B7)
3238

3339
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -36,10 +42,8 @@
3642

3743
## 基础
3844

39-
基础知识/面试题(必看 :+1:):
40-
41-
1. [Java基础](Java/Java基础.md)
42-
2. [Java8总结](Java/Java8.md)
45+
1. [Java基础知识总结](Java/Java基础.md) 基础知识/面试题(必看 :+1:)
46+
2. [Java8 新特性总结](Java/Java8.md)
4347
3. [Java常见关键字总结](Java/Java关键字.md)
4448

4549
## 容器
@@ -48,34 +52,41 @@
4852

4953
## 并发
5054

51-
[Java并发知识点总结](Java/并发.md)(必看 :+1:)
55+
[Java并发知识点总结,超详细!](Java/并发.md)(必看 :+1:)
5256

5357
## JVM
5458

5559
[一万多字!Java虚拟机总结](Java/JVM.md)(必看 :+1:)
5660

5761
# 数据库
5862

59-
1. [MySQL基础知识总结](数据库/mysql基础.md)(必看 :+1:)
63+
## MySQL
64+
65+
1. [MySQL基础知识总结](数据库/mysql基础.md)
6066
2. [MySQL面试知识点总结](数据库/mysql进阶.md)(必看 :+1:)
6167
3. [MySQL执行计划](数据库/Mysql执行计划.md)(必看 :+1:)
6268

63-
# Redis
69+
## Redis
6470

6571
1. [Redis基础](中间件/Redis入门指南总结.md)(必看 :+1:)
6672
2. [Redis分布式锁(必看 :+1:)](中间件/Redis分布式锁.md)
73+
3. [缓存穿透、缓存雪崩、缓存击穿](中间件/缓存穿透、缓存雪崩、缓存击穿.md)
6774

6875
# 框架
6976

7077
## Spring
7178

7279
1. [Spring知识点总结](框架/Spring总结.md)(必看 :+1:)
73-
2. [Spring实战笔记](框架/Spring总结.md)
80+
2. [Spring实战笔记](框架/Spring实战.md)
81+
3. [Spring用到哪些设计模式?](框架/Spring用到哪些设计模式.md)
82+
4. [Spring自动装配](框架/Spring自动装配.md)
7483

7584
## Spring Boot
7685

7786
[Spring Boot总结](框架/SpringBoot实战.md)
7887

88+
[SpringBoot自动配置原理](框架/SpringBoot自动配置原理.md)
89+
7990
## Spring MVC
8091

8192
[Spring MVC知识点总结](框架/SpringMVC.md)
@@ -92,10 +103,44 @@
92103

93104
[Netty实战笔记](框架/netty实战.md)
94105

106+
# 消息队列
107+
108+
## RabbitMQ
109+
110+
1. [RabbitMQ总结](中间件/RabbitMQ.md) (必看 :+1:)
111+
112+
2. [死信队列](中间件/死信队列.md)
113+
114+
# 算法
115+
116+
[谷歌师兄刷题笔记](https://t.1yb.co/A6id)(必看 :+1:)
117+
118+
[BAT大佬总结的刷题手册](https://t.1yb.co/yMbo)
119+
120+
# 网络
95121

122+
[计算机网络常见面试题总结](网络/网络.md)
123+
124+
[session和cookie](网络/session和cookie.md)
125+
126+
# 设计模式
127+
128+
[字节跳动大佬总结的设计模式PDF](https://t.1yb.co/y96J)
129+
130+
[设计模式总结](其他/设计模式.md)
96131

97132
# 工具
98133

99134
[Git 超详细总结!](工具/progit2.md)(必看 :+1:)
100135

136+
[Docker命令大全!](工具/docker.md)
137+
138+
[Maven实战总结](工具/Maven实战.md)
139+
140+
[Jenkins一键部署](工具/jenkins.md)
141+
142+
[npm命令](工具/NPM.md)
143+
144+
145+
101146
> 持续更新中,欢迎star~

中间件/RabbitMQ.md

Lines changed: 45 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,28 @@
1414
- [消息丢失](#%E6%B6%88%E6%81%AF%E4%B8%A2%E5%A4%B1)
1515
- [生产者确认机制](#%E7%94%9F%E4%BA%A7%E8%80%85%E7%A1%AE%E8%AE%A4%E6%9C%BA%E5%88%B6)
1616
- [路由不可达消息](#%E8%B7%AF%E7%94%B1%E4%B8%8D%E5%8F%AF%E8%BE%BE%E6%B6%88%E6%81%AF)
17-
- [Return消息机制](#return%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6)
18-
- [备份交换机](#%E5%A4%87%E4%BB%BD%E4%BA%A4%E6%8D%A2%E6%9C%BA)
17+
- [Return消息机制](#return%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6)
18+
- [备份交换机](#%E5%A4%87%E4%BB%BD%E4%BA%A4%E6%8D%A2%E6%9C%BA)
1919
- [消费者手动消息确认](#%E6%B6%88%E8%B4%B9%E8%80%85%E6%89%8B%E5%8A%A8%E6%B6%88%E6%81%AF%E7%A1%AE%E8%AE%A4)
2020
- [持久化](#%E6%8C%81%E4%B9%85%E5%8C%96)
2121
- [镜像队列](#%E9%95%9C%E5%83%8F%E9%98%9F%E5%88%97)
2222
- [重复消费](#%E9%87%8D%E5%A4%8D%E6%B6%88%E8%B4%B9)
2323
- [消费端限流](#%E6%B6%88%E8%B4%B9%E7%AB%AF%E9%99%90%E6%B5%81)
24-
- [消息过期时间](#%E6%B6%88%E6%81%AF%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4)
2524
- [死信队列](#%E6%AD%BB%E4%BF%A1%E9%98%9F%E5%88%97)
26-
- [实现死信队列](#%E5%AE%9E%E7%8E%B0%E6%AD%BB%E4%BF%A1%E9%98%9F%E5%88%97)
27-
- [pull模式](#pull%E6%A8%A1%E5%BC%8F)
28-
- [消息积压](#%E6%B6%88%E6%81%AF%E7%A7%AF%E5%8E%8B)
25+
- [其他](#%E5%85%B6%E4%BB%96)
26+
- [pull模式](#pull%E6%A8%A1%E5%BC%8F)
27+
- [消息过期时间](#%E6%B6%88%E6%81%AF%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4)
28+
- [参考链接](#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5)
2929

3030
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
3131

32-
[RabbitMQ基础](https://www.jianshu.com/p/79ca08116d57)
33-
34-
[Springboot整合RabbitMQ](https://blog.csdn.net/qq_35387940/article/details/100514134)
35-
36-
[RabbitMQ之消息持久化](https://blog.csdn.net/u013256816/article/details/60875666)
37-
38-
[RabbitMQ发送邮件代码](https://zhuanlan.zhihu.com/p/145908317)
39-
40-
[线上rabbitmq问题](https://juejin.im/post/6844904088212094983#heading-0)
41-
42-
## 简介
32+
# 简介
4333

4434
RabbitMQ是一个由erlang开发的消息队列。消息队列用于应用间的异步协作。
4535

4636
![image-20200718104019614](../img/rabbitmq.png)
4737

48-
### 基本概念
38+
## 基本概念
4939

5040
Message:由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key、priority、delivery-mode(是否持久性存储)等。
5141

@@ -61,21 +51,21 @@ Virtual host:每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器
6151

6252
Broker:消息队列服务器实体。
6353

64-
### 什么时候使用MQ
54+
## 什么时候使用MQ
6555

6656
对于一些不需要立即生效的操作,可以拆分出来,异步执行,使用消息队列实现。
6757

6858
以常见的订单系统为例,用户点击下单按钮之后的业务逻辑可能包括:扣减库存、生成相应单据、发短信通知。这种场景下就可以用 MQ 。将短信通知放到 MQ 异步执行,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息到 MQ, 让主流程快速完结,而由另外的线程消费MQ的消息。
6959

70-
### 优缺点
60+
## 优缺点
7161

7262
缺点:使用erlang实现,不利于二次开发和维护;性能较kafka差,持久化消息和ACK确认的情况下生产和消费消息单机吞吐量大约在1-2万左右,kafka单机吞吐量在十万级别。
7363

7464
优点:有管理界面,方便使用;可靠性高;功能丰富,支持消息持久化、消息确认机制、多种消息分发机制。
7565

7666

7767

78-
## Exchange 类型
68+
# Exchange 类型
7969

8070
Exchange分发消息时根据类型的不同分发策略不同,目前共四种类型:direct、fanout、topic、headers 。headers 模式根据消息的headers进行路由,此外 headers 交换器和 direct 交换器完全一致,但性能差很多。
8171

@@ -88,37 +78,37 @@ Exchange规则。
8878
| topic | 模糊匹配 |
8979
| headers | Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的header属性进行匹配。 |
9080

91-
### direct
81+
## direct
9282

9383
direct交换机会将消息路由到binding key 和 routing key完全匹配的队列中。它是完全匹配、单播的模式。
9484

9585
![](../img/rabbitmq-direct.png)
9686

97-
### fanout
87+
## fanout
9888

9989
所有发到 fanout 类型交换机的消息都会路由到所有与该交换机绑定的队列上去。fanout 类型转发消息是最快的。
10090

10191
![](../img/rabbitmq-fanout.png)
10292

103-
### topic
93+
## topic
10494

10595
topic交换机使用routing key和binding key进行模糊匹配,匹配成功则将消息发送到相应的队列。routing key和binding key都是句点号“. ”分隔的字符串,binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“\*”用于匹配一个单词,“#”用于匹配多个单词。
10696

10797
![](../img/rabbitmq-topic.png)
10898

109-
### headers
99+
## headers
110100

111101
headers交换机是根据发送的消息内容中的headers属性进行路由的。在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。
112102

113103

114104

115-
## 消息丢失
105+
# 消息丢失
116106

117107
消息丢失场景:生产者生产消息到RabbitMQ Server消息丢失、RabbitMQ Server存储的消息丢失和RabbitMQ Server到消费者消息丢失。
118108

119109
消息丢失从三个方面来解决:生产者确认机制、消费者手动确认消息和持久化。
120110

121-
### 生产者确认机制
111+
## 生产者确认机制
122112

123113
生产者发送消息到队列,无法确保发送的消息成功的到达server。
124114

@@ -151,13 +141,13 @@ final RabbitTemplate.ConfirmCallback confirmCallback = (CorrelationData correlat
151141
rabbitTemplate.setConfirmCallback(confirmCallback);
152142
```
153143

154-
### 路由不可达消息
144+
## 路由不可达消息
155145

156146
生产者确认机制只确保消息正确到达交换机,对于从交换机路由到Queue失败的消息,会被丢弃掉,导致消息丢失。
157147

158148
对于不可路由的消息,有两种处理方式:Return消息机制和备份交换机。
159149

160-
#### Return消息机制
150+
## Return消息机制
161151

162152
Return消息机制提供了回调函数 ReturnCallback,当消息从交换机路由到Queue失败才会回调这个方法。需要将`mandatory` 设置为 `true` ,才能监听到路由不可达的消息。
163153

@@ -179,11 +169,11 @@ rabbitTemplate.setReturnCallback(returnCallback);
179169

180170
当消息从交换机路由到Queue失败时,会返回 `return exchange: , routingKey: MAIL, replyCode: 312, replyText: NO_ROUTE`
181171

182-
#### 备份交换机
172+
## 备份交换机
183173

184174
备份交换机alternate-exchange 是一个普通的exchange,当你发送消息到对应的exchange时,没有匹配到queue,就会自动转移到备份交换机对应的queue,这样消息就不会丢失。
185175

186-
### 消费者手动消息确认
176+
## 消费者手动消息确认
187177

188178
有可能消费者收到消息还没来得及处理MQ服务就宕机了,导致消息丢失。因为消息者默认采用自动ack,一旦消费者收到消息后会通知MQ Server这条消息已经处理好了,MQ 就会移除这条消息。
189179

@@ -216,7 +206,7 @@ spring.rabbitmq.listener.simple.acknowledge-mode=manual
216206

217207
当消息消费失败时,消费端给broker回复nack,如果consumer设置了requeue为false,则nack后broker会删除消息或者进入死信队列,否则消息会重新入队。
218208

219-
### 持久化
209+
## 持久化
220210

221211
如果RabbitMQ服务异常导致重启,将会导致消息丢失。RabbitMQ提供了持久化的机制,将内存中的消息持久化到硬盘上,即使重启RabbitMQ,消息也不会丢失。
222212

@@ -228,15 +218,15 @@ spring.rabbitmq.listener.simple.acknowledge-mode=manual
228218

229219
当发布一条消息到交换机上时,Rabbit会先把消息写入持久化日志,然后才向生产者发送响应。一旦从队列中消费了一条消息的话并且做了确认,RabbitMQ会在持久化日志中移除这条消息。在消费消息前,如果RabbitMQ重启的话,服务器会自动重建交换机和队列,加载持久化日志中的消息到相应的队列或者交换机上,保证消息不会丢失。
230220

231-
### 镜像队列
221+
## 镜像队列
232222

233223
当MQ发生故障时,会导致服务不可用。引入RabbitMQ的镜像队列机制,将queue镜像到集群中其他的节点之上。如果集群中的一个节点失效了,能自动地切换到镜像中的另一个节点以保证服务的可用性。
234224

235225
通常每一个镜像队列都包含一个master和多个slave,分别对应于不同的节点。发送到镜像队列的所有消息总是被直接发送到master和所有的slave之上。除了publish外所有动作都只会向master发送,然后由master将命令执行的结果广播给slave,从镜像队列中的消费操作实际上是在master上执行的。
236226

237227

238228

239-
## 重复消费
229+
# 重复消费
240230

241231
消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。
242232

@@ -252,7 +242,7 @@ spring.rabbitmq.listener.simple.acknowledge-mode=manual
252242

253243

254244

255-
## 消费端限流
245+
# 消费端限流
256246

257247
当 RabbitMQ 服务器积压大量消息时,队列里的消息会大量涌入消费端,可能导致消费端服务器奔溃。这种情况下需要对消费端限流。
258248

@@ -273,22 +263,7 @@ spring.rabbitmq.listener.simple.prefetch=2
273263
void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
274264
```
275265

276-
277-
278-
### 消息过期时间
279-
280-
在生产端发送消息的时候可以给消息设置过期时间,单位为毫秒(ms)。
281-
282-
```java
283-
Message msg = new Message("tyson".getBytes(), mp);
284-
msg.getMessageProperties().setExpiration("3000");
285-
```
286-
287-
也可以在创建队列的时候指定队列的ttl,从消息入队列开始计算,超过该时间的消息将会被移除。
288-
289-
290-
291-
## 死信队列
266+
# 死信队列
292267

293268
消费失败的消息存放的队列。
294269

@@ -298,8 +273,6 @@ msg.getMessageProperties().setExpiration("3000");
298273
- 消息超时未消费
299274
- 达到最大队列长度
300275

301-
### 实现死信队列
302-
303276
设置死信队列的 exchange 和 queue,然后进行绑定:
304277

305278
```java
@@ -412,7 +385,7 @@ public class DeadListener {
412385

413386
当普通队列中有死信时,RabbitMQ 就会自动的将这个消息重新发布到设置的死信交换机去,然后被路由到死信队列。可以监听死信队列中的消息做相应的处理。
414387

415-
388+
# 其他
416389

417390
## pull模式
418391

@@ -424,13 +397,25 @@ System.out.println(new String(response.getBody()));
424397
channel.basicAck(response.getEnvelope().getDeliveryTag(),false);
425398
```
426399

400+
## 消息过期时间
427401

402+
在生产端发送消息的时候可以给消息设置过期时间,单位为毫秒(ms)。
428403

429-
## 消息积压
404+
```java
405+
Message msg = new Message("tyson".getBytes(), mp);
406+
msg.getMessageProperties().setExpiration("3000");
407+
```
430408

431-
[Rabbitmq消息积压](http://luxiaobing.com/2019/12/07/RabbitMq%E6%B6%88%E6%81%AF%E7%A7%AF%E5%8E%8B/)
409+
也可以在创建队列的时候指定队列的ttl,从消息入队列开始计算,超过该时间的消息将会被移除。
410+
411+
# 参考链接
412+
413+
[RabbitMQ基础](https://www.jianshu.com/p/79ca08116d57)
414+
415+
[Springboot整合RabbitMQ](https://blog.csdn.net/qq_35387940/article/details/100514134)
416+
417+
[RabbitMQ之消息持久化](https://blog.csdn.net/u013256816/article/details/60875666)
418+
419+
[RabbitMQ发送邮件代码](https://zhuanlan.zhihu.com/p/145908317)
432420

433-
检查消费者是否在线,检查消费端配置属性,是否未配置异常队列的监听器;
434-
检查下生产端或者消费端服务的内存或者cpu是否正常,是否是因为内存溢出导致rabbit服务消息无法发送;
435-
对于手动配置ack机制的,要检查配置是否确认ack,否则会造成消息积压;
436-
开启了手动ack,消费速度跟不上生产速度,检查下消费端是否处理消息流程过长,比较耗时。
421+
[线上rabbitmq问题](https://juejin.im/post/6844904088212094983#heading-0)

0 commit comments

Comments
 (0)