Kevin/ 五月 15, 2018/ 分享

如下是一名学习RateLimiter访问限流的学员提问,十分有代表性。

学员的问题:
1. 如果设置每秒存放100个令牌, 但过了好久都没有请求, 这时令牌数可能已经非常大了, 这时突然来了大量请求, 那服务器可能就会崩掉, 所以能不能限制令牌的最大数;
2. 如果令牌数巨大, 会不会占用一些资源 , 如内存资源;
3. 如果按IP限流, 每个IP对应一个Ratelimit, 随着时间的增长, 内存中的ratelimit会越来越多, 会占用大量内存, 你们是如何控制的;

Kevin的解答:
问题1、RateLimiter提供两种令牌生成模式,一种是以恒定速度生成令牌,第二种是设置渐进模式,令牌缓慢提升生成速度,最终达到一个稳定值,所以你选择第二种可解决你的问题。
问题2,不会占用大量内存资源,令牌的产生是一个概念,RateLimiter是在你获取令牌的时候再去计算你需要多少,而不是预先产生的。
问题3、每个IP对应一个RateLImiter会占用大量内存,我的做法是不会对所有接口做限流,因为现实场景只有一部分特定接口会需要限流,所以不要把所有接口做限流。第二种方式,多个ip共用一个Limiter, 例如1000个ip公用一个,然后估算RateLimiter应该设置的多大。 例如对于公网的请求,一个接口公用一个就可以了; 如果你是对固定ip做限流,证明你们是相互知道的,类似于内网系统间对接,有白名单控制,所以也不需要那么大的量的RateLimiter。

想要学习《RateLimiter高并发访问限流》点击这里: 进入学习