- 浏览: 591456 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
系统在设计之初就会有一个预估容量,长时间超过系统能承受的TPS/QPS阈值,系统可能会被压垮,最终导致整个服务不够用。为了避免这种情况,我们就需要对接口请求进行限流。
限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待。
常见的限流模式有控制并发和控制速率,一个是限制并发的数量,一个是限制并发访问的速率,另外还可以限制单位时间窗口内的请求数量。
控制并发数量
属于一种较常见的限流手段,在实际应用中可以通过信号量机制(如Java中的Semaphore)来实现。
举个例子,我们对外提供一个服务接口,允许最大并发数为10,代码实现如下:
在代码中,虽然有30个线程在执行,但是只允许10个并发的执行。Semaphore的构造方法Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()获取一个许可证,使用完之后调用release()归还许可证,还可以用tryAcquire()方法尝试获取许可证。
控制访问速率
在我们的工程实践中,常见的是使用令牌桶算法来实现这种模式,其他如漏桶算法也可以实现控制速率,但在我们的工程实践中使用不多,这里不做介绍,读者请自行了解。
在Wikipedia上,令牌桶算法是这么描述的:
每过1/r秒桶中增加一个令牌。
桶中最多存放b个令牌,如果桶满了,新放入的令牌会被丢弃。
当一个n字节的数据包到达时,消耗n个令牌,然后发送该数据包。
如果桶中可用令牌小于n,则该数据包将被缓存或丢弃。
令牌桶控制的是一个时间窗口内通过的数据量,在API层面我们常说的QPS、TPS,正好是一个时间窗口内的请求量或者事务量,只不过时间窗口限定在1s罢了。以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。令牌桶的另外一个好处是可以方便的改变速度,一旦需要提高速率,则按需提高放入桶中的令牌的速率。
在我们的工程实践中,通常使用Guava中的Ratelimiter来实现控制速率,如我们不希望每秒的任务提交超过2个:
控制单位时间窗口内请求数
某些场景下,我们想限制某个接口或服务 每秒/每分钟/每天 的请求次数或调用次数。例如限制服务每秒的调用次数为50,实现如下:
http://www.2cto.com/kf/201611/569222.html
限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待。
常见的限流模式有控制并发和控制速率,一个是限制并发的数量,一个是限制并发访问的速率,另外还可以限制单位时间窗口内的请求数量。
控制并发数量
属于一种较常见的限流手段,在实际应用中可以通过信号量机制(如Java中的Semaphore)来实现。
举个例子,我们对外提供一个服务接口,允许最大并发数为10,代码实现如下:
public class DubboService { private final Semaphore permit = new Semaphore(10, true); public void process(){ try{ permit.acquire(); //业务逻辑处理 } catch (InterruptedException e) { e.printStackTrace(); } finally { permit.release(); } } }
在代码中,虽然有30个线程在执行,但是只允许10个并发的执行。Semaphore的构造方法Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()获取一个许可证,使用完之后调用release()归还许可证,还可以用tryAcquire()方法尝试获取许可证。
控制访问速率
在我们的工程实践中,常见的是使用令牌桶算法来实现这种模式,其他如漏桶算法也可以实现控制速率,但在我们的工程实践中使用不多,这里不做介绍,读者请自行了解。
在Wikipedia上,令牌桶算法是这么描述的:
每过1/r秒桶中增加一个令牌。
桶中最多存放b个令牌,如果桶满了,新放入的令牌会被丢弃。
当一个n字节的数据包到达时,消耗n个令牌,然后发送该数据包。
如果桶中可用令牌小于n,则该数据包将被缓存或丢弃。
令牌桶控制的是一个时间窗口内通过的数据量,在API层面我们常说的QPS、TPS,正好是一个时间窗口内的请求量或者事务量,只不过时间窗口限定在1s罢了。以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。令牌桶的另外一个好处是可以方便的改变速度,一旦需要提高速率,则按需提高放入桶中的令牌的速率。
在我们的工程实践中,通常使用Guava中的Ratelimiter来实现控制速率,如我们不希望每秒的任务提交超过2个:
//速率是每秒两个许可 final RateLimiter rateLimiter = RateLimiter.create(2.0); void submitTasks(List tasks, Executor executor) { for (Runnable task : tasks) { rateLimiter.acquire(); // 也许需要等待 executor.execute(task); } }
控制单位时间窗口内请求数
某些场景下,我们想限制某个接口或服务 每秒/每分钟/每天 的请求次数或调用次数。例如限制服务每秒的调用次数为50,实现如下:
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; 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(); } //业务处理 }
http://www.2cto.com/kf/201611/569222.html
发表评论
-
DataStream API 简介
2022-07-19 18:28 154DataStream API 简介 -
WAF安全报表
2022-03-08 20:22 149WAF安全报表 waf应用防火墙详解 -
Arthas 使用的各类方式
2021-11-26 13:56 232引用Arthas 是阿里巴巴开源的 Java 诊断工具。让我们 ... -
DDD(领域驱动设计)
2021-08-23 21:05 493DDD(领域驱动设计)是微服务体系结构的核心和最重要的基础 ... -
分布式系统中一致性哈希算法
2019-09-29 15:19 229https://www.cnblogs.com/jajian/ ... -
微服务架构初探
2018-03-20 21:05 394http://www.iteye.com/news/32932 ... -
说说API的防重放机制
2018-03-06 21:18 939http://www.cnblogs.com/yjf512/p ... -
从架构演进的角度聊聊 Spring Cloud 都做了些什么?
2017-11-03 09:06 446http://www.iteye.com/news/32734 ... -
高并发系统之限流特技
2017-03-09 15:28 541参考: 高并发系统之限流特技 http://blog.csdn ... -
超时,重试,熔断,限流
2017-03-09 14:36 13341 写在前面 1.1 名词解 ... -
JProfiler 监控Tomcat
2016-09-08 17:44 500http://jingyan.baidu.com/album/ ... -
理解RESTful架构
2016-08-03 15:49 558越来越多的人开始意识 ... -
跟我学Shiro目录贴
2016-07-19 08:37 313http://jinnianshilongnian.iteye ... -
跟我一起云计算(6)——openAPI
2016-07-15 09:52 418http://www.cnblogs.com/skyme/p/ ... -
Shiro相关资料
2016-07-14 17:29 457官网:http://shiro.apache.org/docu ... -
理解OAuth 2.0
2016-07-06 11:31 435什么是OAuth授权? 一 ... -
架构漫谈(一):什么是架构?
2016-05-15 13:35 376架构漫谈是由资深架 ...
相关推荐
计算机后端-Java-Java高并发从入门到面试教程-用限流思路.zip
(2)工作了3年的程序员小菜面试高并发岗位被吊打虐哭 (3)如何解决可见性和有序性问题?这次彻底懂了! 3、实战案例篇 (1) 如何实现亿级流量下的分布式限流?这些理论你必须掌握 (2) 亿级流量场景下如何为HTTP接口限流...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具: IntelliJ IDEA + Navicat + ...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime ...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime ...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime ...
高性能:秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键 一致性:秒杀商品减库存的实现方式同样关键,有限数量的商品在同一时刻被很多倍的请求同时来减库存,在大并发更新的过程中都要保证数据的...
后端开发:涉及服务器端编程、API开发、数据库集成等技术。 移动应用开发:包括iOS开发(使用Swift或Objective-C)和Android开发(使用Java或Kotlin)等。 大数据技术:包括Hadoop、Spark、Hive等用于处理和分析大...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 技术: 前端技术 :Bootstrap + jQuery + ...
限流: 鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。 削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的...
- 限流、限流、限流,毕竟秒杀商品有限,防刷的前提下没有绝对的公平,根据每个服务的负载能力,设定流量极限。 - 缓存、缓存、缓存、尽量不要让大量请求穿透到DB层,活动开始前商品信息可以推送至分布式缓存。 - ...
基于SpringBoot的秒杀系统...适用于Java后端开发人员、全栈开发人员以及对高并发系统设计感兴趣的学习者。通过学习和实践该项目,开发者可以深入理解秒杀系统的设计和实现细节,提升自己在高并发系统开发方面的能力。
上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,...13、大型电商网站的工程运维实践:在大型系统中,一定是需要对整套工程的运维流程做良好的设计的,包括了线下压测、线上压测、灰度发布、高峰期限流。
分享课程——基于云原生架构构建亿级多语言电商平台设计...13.高并发下的服务降级、限流实战 14.实现高并发请求和实现高可用架构解决方案 15.引入大数据技术 16、引入人工智能技术 17.全程代码实操,提供课程代码和资料
毕业设计,微信小程序+SSM后端+MySql开发的在线厨艺平台小程序,内含完整源代码,数据库脚本,论文答辩,视频教程 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,...
毕业设计,微信小程序+SSM后端+MySql开发的答题小程序,内含完整源代码,数据库脚本,论文视频,视频教程 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息...
毕业设计,微信小程序+SpringBoot后端+MySql开发的中国各地美食推荐平台,内含完整源代码,数据库,论文视频,视频教程 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的...