高并发限流(二)——应用举例
来源:互联网 发布:什么是网络教学 编辑:程序博客网 时间:2024/06/05 18:07
1.对单个接口的总并发数进行限制
1.利用一个AtomicLong变量进行简单粗暴的限流
try { if(atomic.incrementAndGet() > 限流数) { //拒绝请求 } //处理请求} finally { atomic.decrementAndGet();}
2.利用SHARED模式的ReentrantLock
try { if(lock.lock()) { //拒绝请求 } //处理请求} finally { lock.unlock();}
这里可以根据需要采用完全阻塞的lock,立即返回的tryLock,以及带等待时间的lock(lockTime)等方法。
3.异步
对于异步需要注意,如果consumer方没有回调或者回调超时,要保证对应请求的decrement和unlock操作都要执行,否则计数就会有问题了。
2.限流某个接口的时间窗请求数
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); } });long limit = 1000;while(true) { //得到当前秒 long currentSeconds = System.currentTimeMillis() / 1000; if(counter.get(currentSeconds).incrementAndGet() > limit) { System.out.println("限流了:" + currentSeconds); continue; } //业务处理}
这里统计每秒内的请求次数总和,过期时间设置为大于1s的时间即可,保证1s内的统计不会过期。
和上面段落实现功能的区别:
上面限制总并发数的限制,如果业务流执行很快,很快就decrementAndGet或者unlock,那么1s内可以接收很多请求,比如业务处理消耗1ms,即使并发数最大是1,1s中也可以接收1000个请求。
本段落限制时间窗内的请求数就和业务执行快慢无关了,这里只统计1s钟内执行了多少次,即使业务处理消耗时间很少,比如1ms,但是如果在第一个ms内就来了1000个请求,那么剩余的999ms就一个请求也进不来了。
3.分布式限流
用redis实现的分布式限流,
int current = jedis.incr(key);if (current + 1 > limit) //如果超出限流大小 return 0;else if (current == 1) //只有第一次访问需要设置2秒的过期时间 jedis.expire(key, "2");return 1
0 0
- 高并发限流(二)——应用举例
- 高并发限流(一)——简介
- 高并发限流
- 高并发之限流
- 高并发系统限流
- 高并发的限流特技
- 高并发系统限流特技
- 高并发系统限流特技2
- 高并发系统之限流特技
- 聊聊高并发系统之限流特技
- 使用lua语言做高并发限流
- 聊聊高并发系统之限流特技
- 聊聊高并发系统限流特技-2
- 聊聊高并发系统之限流特技
- 聊聊高并发系统之限流特技
- 高并发系统之限流特技
- 聊聊高并发系统之限流特技
- 高并发系统之限流特技
- js 如何简单抽象出库
- 杭电OJ 1228 A + B
- 程序员人生成功法则
- POJ 3737 UmBasketella(三分)
- Linux串口通信编程
- 高并发限流(二)——应用举例
- android broadcastReceiver 常用的广播
- HTML——清单标记
- android背景音乐播放
- 敏捷实施的起点--需求分析的思考
- (模板题)sdut 3403 数据结构实验之排序六:希尔排序(希尔排序)
- 109. Convert Sorted List to Binary Search Tree
- 刚刚创建了个博客,明年买个。恩,就这样决定了。来,先试下!
- 简易使用POI导入导出excel文件