一、测试环境
(1) MySQL服务器一台
(2)应用系统
(3)JMeter压力测试工具
测试结果
系统并发数量与响应时间
并发数量 | 响应时间 |
10 | 44ms |
50 | 253ms |
100 | 4.4s |
200 | 29.77s |
更多... | 系统渐渐无响应 |
系统在并发量逐渐增加后,系统渐渐不可用,最后变成无响应,可以模拟出线上已经宕机。
如何才能保护我们的系统,防止在缓存击穿后保护我们的数据库系统呢?
可以使用限流办法来解决。
二、限流组件
RateLimiter组件
谷歌的RateLimter组件 能够 每X秒发放N个令牌,只有拿到令牌的线程才能访问接口。
特别注意RateLimiter是单机的,也就是说它无法跨JVM使用。单机部署可以考虑使用。
import com.google.common.util.concurrent.RateLimiter;
@RestController
public class UserController ...
//每秒发放2个令牌,意味着每秒最多有2个线程进入接口
private static RateLimiter rateLimiter = RateLimiter.create(2);
@GetMapping(value = "/get")
public UserDO getById(String id) throws InterruptedException {
if (rateLimiter.tryAcquire()) {
return userService.getById(id);
}
return null;
}