Skip to content

Commit 0c0efe5

Browse files
committed
[docs update]部分描述修正完善
1 parent 38cebbc commit 0c0efe5

File tree

5 files changed

+52
-25
lines changed

5 files changed

+52
-25
lines changed

docs/high-availability/limit-request.md

+42-13
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ icon: limit_rate
66

77
针对软件系统来说,限流就是对请求的速率进行限制,避免瞬时的大量请求击垮软件系统。毕竟,软件系统的处理能力是有限的。如果说超过了其处理能力的范围,软件系统可能直接就挂掉了。
88

9-
限流可能会导致用户的请求无法被正确处理,不过,这往往也是权衡了软件系统的稳定性之后得到的最优解。
9+
限流可能会导致用户的请求无法被正确处理或者无法立即被处理,不过,这往往也是权衡了软件系统的稳定性之后得到的最优解。
1010

1111
现实生活中,处处都有限流的实际应用,就比如排队买票是为了避免大量用户涌入购票而导致售票员无法处理。
1212

@@ -18,33 +18,45 @@ icon: limit_rate
1818
1919
### 固定窗口计数器算法
2020

21-
固定窗口其实就是时间窗口**固定窗口计数器算法** 规定了我们单位时间处理的请求数量
21+
固定窗口其实就是时间窗口,其原理是将时间划分为固定大小的窗口,在每个窗口内限制请求的数量或速率,即固定窗口计数器算法规定了系统单位时间处理的请求数量
2222

23-
假如我们规定系统中某个接口 1 分钟只能访问 33 次的话,使用固定窗口计数器算法的实现思路如下:
23+
假如我们规定系统中某个接口 1 分钟只能被访问 33 次的话,使用固定窗口计数器算法的实现思路如下:
2424

25+
- 将时间划分固定大小窗口,这里是 1 分钟一个窗口。
2526
- 给定一个变量 `counter` 来记录当前接口处理的请求数量,初始值为 0(代表接口当前 1 分钟内还未处理请求)。
2627
- 1 分钟之内每处理一个请求之后就将 `counter+1` ,当 `counter=33` 之后(也就是说在这 1 分钟内接口已经被访问 33 次的话),后续的请求就会被全部拒绝。
2728
- 等到 1 分钟结束后,将 `counter` 重置 0,重新开始计数。
2829

29-
这种限流算法限流不够平滑。例如,我们限制某个接口每分钟只能访问 30 次,假设前 30 秒就有 30 个请求到达的话,那后续 30 秒将无法处理请求,这是不可取的,用户体验极差!
30+
![固定窗口计数器算法](https://static001.infoq.cn/resource/image/8d/15/8ded7a2b90e1482093f92fff555b3615.png)
3031

31-
除此之外,这种限流算法无法保证限流速率,因而无法应对突然激增的流量。例如,我们限制某个接口 1 分钟只能访问 1000 次,该接口的 QPS 为 500,前 55s 这个接口 1 个请求没有接收,后 1s 突然接收了 1000 个请求。然后,在当前场景下,这 1000 个请求在 1s 内是没办法被处理的,系统直接就被瞬时的大量请求给击垮了
32+
优点:实现简单,易于理解
3233

33-
![固定窗口计数器算法](https://static001.infoq.cn/resource/image/8d/15/8ded7a2b90e1482093f92fff555b3615.png)
34+
缺点:
35+
36+
- 限流不够平滑。例如,我们限制某个接口每分钟只能访问 30 次,假设前 30 秒就有 30 个请求到达的话,那后续 30 秒将无法处理请求,这是不可取的,用户体验极差!
37+
- 无法保证限流速率,因而无法应对突然激增的流量。例如,我们限制某个接口 1 分钟只能访问 1000 次,该接口的 QPS 为 500,前 55s 这个接口 1 个请求没有接收,后 1s 突然接收了 1000 个请求。然后,在当前场景下,这 1000 个请求在 1s 内是没办法被处理的,系统直接就被瞬时的大量请求给击垮了。
3438

3539
### 滑动窗口计数器算法
3640

37-
**滑动窗口计数器算法** 算的上是固定窗口计数器算法的升级版。
41+
**滑动窗口计数器算法** 算的上是固定窗口计数器算法的升级版,限流的颗粒度更小
3842

3943
滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:**它把时间以一定比例分片**
4044

41-
例如我们的接口限流每分钟处理 60 个请求,我们可以把 1 分钟分为 60 个窗口。每隔 1 秒移动一次,每个窗口一秒只能处理 不大于 `60(请求数)/60(窗口数)` 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。
45+
例如我们的接口限流每分钟处理 60 个请求,我们可以把 1 分钟分为 60 个窗口。每隔 1 秒移动一次,每个窗口一秒只能处理不大于 `60(请求数)/60(窗口数)` 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。
4246

4347
很显然, **当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。**
4448

4549
![滑动窗口计数器算法](https://static001.infoq.cn/resource/image/ae/15/ae4d3cd14efb8dc7046d691c90264715.png)
4650

47-
滑动窗口计数器算法可以应对突然激增的流量,但依然存在限流不够平滑的问题。
51+
优点:
52+
53+
- 相比于固定窗口算法,滑动窗口计数器算法可以应对突然激增的流量。
54+
- 相比于固定窗口算法,滑动窗口计数器算法的颗粒度更小,可以提供更精确的限流控制。
55+
56+
缺点:
57+
58+
- 与固定窗口计数器算法类似,滑动窗口计数器算法依然存在限流不够平滑的问题。
59+
- 相比较于固定窗口计数器算法,滑动窗口计数器算法实现和理解起来更复杂一些。
4860

4961
### 漏桶算法
5062

@@ -54,7 +66,15 @@ icon: limit_rate
5466

5567
![漏桶算法](https://static001.infoq.cn/resource/image/75/03/75938d1010138ce66e38c6ed0392f103.png)
5668

57-
漏桶算法可以控制限流速率,避免网络拥塞和系统过载。不过,漏桶算法无法应对突然激增的流量,因为只能以固定的速率处理请求,对系统资源利用不够友好。
69+
优点:
70+
71+
- 实现简单,易于理解。
72+
- 可以控制限流速率,避免网络拥塞和系统过载。
73+
74+
缺点:
75+
76+
- 无法应对突然激增的流量,因为只能以固定的速率处理请求,对系统资源利用不够友好。
77+
- 桶流入水(发请求)的速率如果一直大于桶流出水(处理请求)的速率的话,那么桶会一直是满的,一部分新的请求会被丢弃,导致服务质量下降。
5878

5979
实际业务场景中,基本不会使用漏桶算法。
6080

@@ -64,7 +84,15 @@ icon: limit_rate
6484

6585
![令牌桶算法](https://static001.infoq.cn/resource/image/ec/93/eca0e5eaa35dac938c673fecf2ec9a93.png)
6686

67-
令牌桶算法可以限制平均速率和应对突然激增的流量,还可以动态调整生成令牌的速率。不过,如果令牌产生速率和桶的容量设置不合理,可能会出现问题比如大量的请求被丢弃、系统过载。
87+
优点:
88+
89+
- 可以限制平均速率和应对突然激增的流量。
90+
- 可以动态调整生成令牌的速率。
91+
92+
缺点:
93+
94+
- 如果令牌产生速率和桶的容量设置不合理,可能会出现问题比如大量的请求被丢弃、系统过载。
95+
- 相比于其他限流算法,实现和理解起来更复杂一些。
6896

6997
## 针对什么来进行限流?
7098

@@ -225,9 +253,9 @@ Resilience4j 不仅提供限流,还提供了熔断、负载保护、自动重
225253

226254
> ShenYu 地址: <https://github.com/apache/incubator-shenyu>
227255
228-
![ShenYu 限流脚本](https://oss.javaguide.cn/github/javaguide/csdn/e1e2a75f489e4854990dabe3b6cec522.jpg)
256+
![ShenYu 限流脚本](https://oss.javaguide.cn/github/javaguide/high-availability/limit-request/shenyu-ratelimit-lua-scripts.png)
229257

230-
另外,如果不想自己写 Lua 脚本的话,也可以直接利用 Redisson 中的 `RRateLimiter` 来实现分布式限流,其底层实现就是基于 Lua 代码。
258+
另外,如果不想自己写 Lua 脚本的话,也可以直接利用 Redisson 中的 `RRateLimiter` 来实现分布式限流,其底层实现就是基于 Lua 代码+令牌桶算法
231259

232260
Redisson 是一个开源的 Java 语言 Redis 客户端,提供了很多开箱即用的功能,比如 Java 中常用的数据结构实现、分布式锁、延迟队列等等。并且,Redisson 还支持 Redis 单机、Redis Sentinel、Redis Cluster 等多种部署架构。
233261

@@ -265,5 +293,6 @@ boolean res = rateLimiter.tryAcquire(1, 5, TimeUnit.SECONDS);
265293
- 实战 Spring Cloud Gateway 之限流篇 👍:<https://www.aneasystone.com/archives/2020/08/spring-cloud-gateway-current-limiting.html>
266294
- 详解 Redisson 分布式限流的实现原理:<https://juejin.cn/post/7199882882138898489>
267295
- 一文详解 Java 限流接口实现 - 阿里云开发者:<https://mp.weixin.qq.com/s/A5VYjstIDeVvizNK2HkrTQ>
296+
- 分布式限流方案的探索与实践 - 腾讯云开发者:<https://mp.weixin.qq.com/s/MJbEQROGlThrHSwCjYB_4Q>
268297

269298
<!-- @include: @article-footer.snippet.md -->

docs/high-performance/read-and-write-separation-and-library-subtable.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ MySQL 主从同步延时是指从库的数据落后于主库的数据,这种
194194

195195
- 单表的数据达到千万级别以上,数据库读写速度比较缓慢。
196196
- 数据库中的数据占用的空间越来越大,备份时间越来越长。
197-
- 应用的并发量太大。
197+
- 应用的并发量太大(应该优先考虑其他性能优化方法,而非分库分表)
198198

199199
不过,分库分表的成本太高,如非必要尽量不要采用。而且,并不一定是单表千万级数据量就要分表,毕竟每张表包含的字段不同,它们在不错的性能下能够存放的数据量也不同,还是要具体情况具体分析。
200200

docs/java/concurrent/java-concurrent-questions-03.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,11 @@ static class Entry extends WeakReference<ThreadLocal<?>> {
232232
233233
另外,《阿里巴巴 Java 开发手册》中强制线程池不允许使用 `Executors` 去创建,而是通过 `ThreadPoolExecutor` 构造函数的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险
234234

235-
`Executors` 返回线程池对象的弊端如下(后文会详细介绍到)
235+
`Executors` 返回线程池对象的弊端如下:
236236

237-
- **`FixedThreadPool``SingleThreadExecutor`**使用的是无界的 `LinkedBlockingQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
238-
- **`CachedThreadPool`**使用的是同步队列 `SynchronousQueue`, 允许创建的线程数量为 `Integer.MAX_VALUE` ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。
239-
- **`ScheduledThreadPool``SingleThreadScheduledExecutor`** : 使用的无界的延迟阻塞队列`DelayedWorkQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
237+
- **`FixedThreadPool``SingleThreadExecutor`**:使用的是无界的 `LinkedBlockingQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
238+
- **`CachedThreadPool`**:使用的是同步队列 `SynchronousQueue`, 允许创建的线程数量为 `Integer.MAX_VALUE` ,如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。
239+
- **`ScheduledThreadPool``SingleThreadScheduledExecutor`**:使用的无界的延迟阻塞队列`DelayedWorkQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
240240

241241
```java
242242
// 无界队列 LinkedBlockingQueue

docs/java/concurrent/java-thread-pool-summary.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,9 @@ Spring 通过 `ThreadPoolTaskExecutor` 或者我们直接通过 `ThreadPoolExecu
167167

168168
`Executors` 返回线程池对象的弊端如下(后文会详细介绍到):
169169

170-
- **`FixedThreadPool``SingleThreadExecutor`**使用的是无界的 `LinkedBlockingQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
171-
- **`CachedThreadPool`**使用的是同步队列 `SynchronousQueue`, 允许创建的线程数量为 `Integer.MAX_VALUE`可能会创建大量线程,从而导致 OOM。
172-
- **`ScheduledThreadPool``SingleThreadScheduledExecutor`** : 使用的无界的延迟阻塞队列`DelayedWorkQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
170+
- **`FixedThreadPool``SingleThreadExecutor`**:使用的是无界的 `LinkedBlockingQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
171+
- **`CachedThreadPool`**:使用的是同步队列 `SynchronousQueue`, 允许创建的线程数量为 `Integer.MAX_VALUE`如果任务数量过多且执行速度较慢,可能会创建大量的线程,从而导致 OOM。
172+
- **`ScheduledThreadPool``SingleThreadScheduledExecutor`**:使用的无界的延迟阻塞队列`DelayedWorkQueue`,任务队列最大长度为 `Integer.MAX_VALUE`,可能堆积大量的请求,从而导致 OOM。
173173

174174
```java
175175
// 无界队列 LinkedBlockingQueue

docs/open-source-project/practical-project.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ icon: project
4949
- [HOJ](https://gitee.com/himitzh0730/hoj):分布式架构的在线测评平台 OJ ,功能非常全面,支持刷题、训练、比赛、评测等功能。
5050
- [VOJ](https://github.com/simplefanC/voj):基于微服务架构的高性能在线评测系统。拥有本地判题服务,同时支持其它知名 OJ (HDU、POJ...) 的远程判题。采用现阶段流行技术实现,采用 Docker 容器化部署。
5151
- [OnlineJudge](https://github.com/SDUOJ/OnlineJudge):基于微服务架构的在线评测系统,支持多种国际赛制支持(ICPC/OI/IOI),采用 Docker 容器化部署。
52-
- [uexam](https://gitee.com/mindskip/uexam)一个非常不错的考试系统!考试系统应用场景还挺多的,不论是对于在校大学生还是已经工作的小伙伴,并且,类似的私活也有很多。相关阅读:[好一个 Spring Boot 开源在线考试系统!解决了我的燃眉之急](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247491585%26idx%3D1%26sn%3D8d3c6768c22e72d6bfcbeee9624886a7%26chksm%3Dcea1afcaf9d626dc918760289c37025ad526f6255786bc198d2402203df64c873ad7934f58df%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)
53-
- [PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform)一个基于微服务(SpringBoot、Spring Cloud)的面试刷题系统!相关阅读:[一个基于 Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247497045%26idx%3D1%26sn%3D577175bfd6c040a0df5a494fce6f9758%26chksm%3Dcea1ba9ef9d633883a2e213c0fb9a88bdc87051347d4b3fad2c2befb65d8b16e1ea81d8146dd%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)
52+
- [uexam](https://gitee.com/mindskip/uexam)功能全面的在线考试系统,开发部署简单快捷、界面设计友好、代码结构清晰。相关阅读:[好一个 Spring Boot 开源在线考试系统!解决了我的燃眉之急](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247491585%26idx%3D1%26sn%3D8d3c6768c22e72d6bfcbeee9624886a7%26chksm%3Dcea1afcaf9d626dc918760289c37025ad526f6255786bc198d2402203df64c873ad7934f58df%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)
53+
- [PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform)基于微服务架构的面试刷题小程序!相关阅读:[一个基于 Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽](http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzg2OTA0Njk0OA%3D%3D%26mid%3D2247497045%26idx%3D1%26sn%3D577175bfd6c040a0df5a494fce6f9758%26chksm%3Dcea1ba9ef9d633883a2e213c0fb9a88bdc87051347d4b3fad2c2befb65d8b16e1ea81d8146dd%26scene%3D178%26cur_album_id%3D1345382825083895808%23rd)
5454

5555
## 商城系统
5656

@@ -59,9 +59,7 @@ icon: project
5959
- [congomall](https://gitee.com/nageoffer/congomall):不一样的 TOC 商城系统,SpringCloud-Alibaba 微服务架构设计,基于 DDD 领域驱动模型开发,代码设计优雅,涵盖商城核心业务。
6060
- [mall](https://github.com/macrozheng/mall "mall"):mall 项目是一套电商系统,包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现。
6161
- [mall-swarm](https://github.com/macrozheng/mall-swarm "mall-swarm") : mall-swarm 是一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技术,同时提供了基于 Vue 的管理后台方便快速搭建系统。
62-
- [onemall](https://github.com/YunaiV/onemall):mall 商城,基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。
6362
- [litemall](https://github.com/linlinjava/litemall "litemall"):又一个小商城。litemall = Spring Boot 后端 + Vue 管理员前端 + 微信小程序用户前端 + Vue 用户移动端。
64-
- [xmall](https://github.com/Exrick/xmall) :基于 SOA 架构的分布式电商购物商城 前后端分离 前台商城:Vue 全家桶 后台管理系统:Spring/Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper 等
6563
- [newbee-mall](https://github.com/newbee-ltd/newbee-mall) :newbee-mall 项目(新蜂商城)是一套电商系统,包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统,基于 Spring Boot 2.X 及相关技术栈开发。
6664

6765
## 售票系统

0 commit comments

Comments
 (0)