限流(限制并发访问量) 对并发访问/请求限速,一旦达到限制速率可排队等待,可降级,或者拒绝服务
缓存(提高系统可容纳并发访问量) 提高系统并发访问速度,增大系统处理容量
降级 暂时屏蔽掉非核心问题,待问题处理完成或者高峰过去后再打开
限流模式 有控制并发和控制速率两种,一个是限制并发的总数量(比如数据库连接池、线程池),一个是限制并发访问的速率(如nginx的limitconn模块,用来限制瞬时并发连接数),
另外还可以限制单位时间窗口内的请求数量(如Guava的RateLimiter、nginx的limitreq模块,限制每秒的平均速率)。
其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。
//1.控制并发:对外提供一个服务接口,允许最大并发数为10
//Semaphore信号量控制acquire() 最优方案是使用Semaphore,但Semaphore无法统计实际高峰期时的并发量有多少
public class DubboService {
private final Semaphore permit = new Semaphore(10, true);
public void process(){
try{
permit.acquire();//线程使用Semaphore的acquire()获取一个许可证,还可以用tryAcquire()方法尝试获取许可证
// TODO 方法中的业务逻辑
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
permit.release();//使用完之后调用release()归还许可证
}
}
}
//Semaphore信号量控制tryAcquire()
private static Semaphore semaphore = new Semaphore(10);
public static Integer methodA() {
if(semaphore.tryAcquire()) {//tryAcquire()方法尝试获取许可证
try {
// TODO 方法中的业务逻辑
} finally {
semaphore.release();
}
}
}
//阻塞队列
private static BlockingQueue<Integer> reqQueue = new ArrayBlockingQueue<>(10);
public static Integer methodA() {
if(reqQueue.offer()) {
try {
// TODO 方法中的业务逻辑
} finally {
reqQueue.poll();
}
}
}
2.限流算法有两种常用:漏桶算法和令牌桶算法。
漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。
对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,
当桶里没有令牌可取时,则拒绝服务,令牌桶算法通过发放令牌,根据令牌的rate频率做请求频率限制,容量限制等。
3.控制单位时间窗口内请求数
//我们想限制某个接口或服务 每秒/每分钟/每天 的请求次数或调用次数。例如限制服务每秒的调用次数为50
private LoadingCache < Long, AtomicLong > counter = CacheBuilder.newBuilder().expireAfterWrite(2, TimeUnit.SECONDS).build(new CacheLoader < Long, AtomicLong > () {@
Override
public AtomicLong load(Long seconds) throws Exception {
return new AtomicLong(0);
}
});
public static long permit = 50;
public ResponseEntity getData() throws ExecutionException {
//得到当前秒
long currentSeconds = System.currentTimeMillis() / 1000;
if (counter.get(currentSeconds).incrementAndGet() > permit) {
return ResponseEntity.builder().code(404).msg("访问速率过快").build();
}
//业务处理
}
PV:page view 页面总访问量,每刷新一次记录一次。
UV:unique view 客户端主机访问,指一天内相同IP的访问记为1次。
QPS:query per second,即每秒访问量。qps很大程度上代表了系统的繁忙度,没次请求可能存在多次的磁盘io,网络请求,多个cpu时间片,
一旦qps超过了预先设置的阀值,可以考量扩容增加服务器,避免访问量过大导致的宕机。
RT:response time,每次请求的响应时间,直接决定用户体验性。
浙公网安备 33010602011771号