赞
踩
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。
服务降级:在高并发的情况, 防止用户一直等待,直接返回一个友好的错误提示给客户端。
服务熔断:在高并发的情况,一旦达到服务最大的承受极限,直接拒绝访问,使用服务降级。
服务隔离:
服务限流:在高并发的情况,一旦服务承受不了,使用服务限流机制
常见的限流算法有:令牌桶、漏桶。计数器也可以简单粗暴地实现限流。
它是限流算法中最简单最容易的一种算法,比如我们要求某一个接口,3秒钟内的请求不能超过3次。
我们可以在开始时设置一个计数器,每次请求,该计数器+1;
如果该计数器的值大于3并且与第一次请求的时间间隔在3秒钟内,那么说明请求过多,应该限流;
如果该请求与第一次请求的时间间隔大于3秒钟,并且该计数器的值还在限流范围内,那么重置该计数器。
/** * 计数器限流 */ public class LimitCountDemo { private int limtCount = 3;// 限制最大访问的容量 AtomicInteger atomicInteger = new AtomicInteger(0); // 每秒钟 实际请求的数量 private boolean isReset = false; private long start = System.currentTimeMillis();// 获取当前系统时间 private int interval = 3000;// 间隔时间 private final ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); // 线程池 private static final Logger logger = LoggerFactory.getLogger(LimitCountDemo.class); private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS"); private synchronized boolean acquire() { long newTime = System.currentTimeMillis(); if (newTime > (start + interval) && !isReset) { isReset = true; // 判断是否是一个周期 start = newTime; logger.info("start=" + sdf.format(new Date(start))); atomicInteger.set(0); // 清理为0 } if (isReset) { isReset = false; } int i = atomicInteger.incrementAndGet();// i++; logger.info("atomicInteger=" + i); return i <= limtCount; } private void access() { for (int i = 1; i <= 6; i++) { final int tempI
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。