文章目錄

Node服务高并发高可用之容器化与负载均衡中,我们已经解决了QPS如何满足用户需求的问题,这一篇我们再讲讲限流,以及如何使用限流来提高我们服务的可用性。在使用node-rate-limiter-flexible服务限流中,已经提过一次限流,这里我们继续说一说。

限流有很多用途,比如很多道友会提供接口给人用,为了限制对方调用的调用频率,此时就可以加上限流功能。

比如有个网站每秒只支持100个人访问,结果有同时有10000个人去访问,如果没有限流,可能网站就会奔溃了。

比如一个接口每秒只能支持10QPS, 但调用方因为突发流量,每秒调用100次,那这时候第10次~20次请求就要1~2秒才响应,第20~30次请求就要2~3秒才响应,第90~100次请求就要9~10秒才响应,导致接口超时严重,运维就会找过来了。

如果加上限流功能,这上面的问题就都解决了。当访问数量超过支持的数量时,就直接告诉对方,你被限流了,这样能保证自己的服务不会奔溃。

Node里有很多限流模块,我这里使用node-rate-limiter-flexible,它不需要引入额外模块如Redis等做限流,只是在每个Node进程里做限流,满足我的需求。一个简单的配置如下

1
2
3
4
5
6
7
8
9
10
11
const burstyLimiter = new BurstyRateLimiter(
new RateLimiterMemory({
points: 3,
duration: 1,
}),
new RateLimiterMemory({
keyPrefix: 'burst',
points: 5,
duration: 5,
})
);

它是用了两个限流配置,第一个的令牌用完了,就会去用第二个的。如下就是一个QPS是4,支持突发流量到8的配置,相当好用。第一个配置每一秒生成3个令牌,第二个配置每5秒生成5个令牌,那么5秒内就一共可以生成3 * 5 + 5 = 20个令牌,相当于这5秒内的QPS是4,而它的突发流量是8,也就是第一秒内如果进来8个请求,它也不会触发限流。

在服务高可用方面,除了限流,还有熔断,服务降级,我也只听过,没用过。我这里只使用限流功能就够了,其它就不管了。

打赏作者

文章目錄