- 浏览: 626688 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 184DataStream API 简介 -
WAF安全报表
2022-03-08 20:22 175WAF安全报表 waf应用防火墙详解 -
Arthas 使用的各类方式
2021-11-26 13:56 273引用Arthas 是阿里巴巴开源的 Java 诊断工具。让我们 ... -
DDD(领域驱动设计)
2021-08-23 21:05 517DDD(领域驱动设计)是微服务体系结构的核心和最重要的基础 ... -
分布式系统中一致性哈希算法
2019-09-29 15:19 249https://www.cnblogs.com/jajian/ ... -
微服务架构初探
2018-03-20 21:05 431http://www.iteye.com/news/32932 ... -
说说API的防重放机制
2018-03-06 21:18 991http://www.cnblogs.com/yjf512/p ... -
从架构演进的角度聊聊 Spring Cloud 都做了些什么?
2017-11-03 09:06 473http://www.iteye.com/news/32734 ... -
高并发系统之限流特技
2017-03-09 15:28 580参考: 高并发系统之限流特技 http://blog.csdn ... -
超时,重试,熔断,限流
2017-03-09 14:36 13671 写在前面 1.1 名词解 ... -
JProfiler 监控Tomcat
2016-09-08 17:44 521http://jingyan.baidu.com/album/ ... -
理解RESTful架构
2016-08-03 15:49 593越来越多的人开始意识 ... -
跟我学Shiro目录贴
2016-07-19 08:37 334http://jinnianshilongnian.iteye ... -
跟我一起云计算(6)——openAPI
2016-07-15 09:52 440http://www.cnblogs.com/skyme/p/ ... -
Shiro相关资料
2016-07-14 17:29 478官网:http://shiro.apache.org/docu ... -
理解OAuth 2.0
2016-07-06 11:31 463什么是OAuth授权? 一 ... -
架构漫谈(一):什么是架构?
2016-05-15 13:35 404架构漫谈是由资深架 ...
相关推荐
本教程"Java高并发从入门到面试教程"着重讲解了如何利用限流策略来优化系统性能,以应对大量并发请求。限流是系统架构设计中的重要组成部分,它能够防止系统因过量的请求而崩溃,同时保证服务的质量和响应时间。 ...
4. **熔断与降级**:在高并发或服务故障时,网关需要具备熔断和降级机制,如Hystrix提供的服务隔离、超时控制和断路器模式,以防止整个系统因单个服务的故障而崩溃。 5. **限流与熔断**:使用如Netflix的Zuul或...
本教程专注于Java高并发编程,这是现代软件系统设计中的关键部分,特别是在处理大量用户请求和服务之间交互时。"务降级与服务"是这个主题的一个重要概念,它涉及到在系统负载过高或者资源紧张时如何确保核心业务的...
**实战案例篇**探讨了在亿级流量场景下如何实现分布式限流和HTTP接口限流,其中使用注解进行接口限流的方法被详细阐述,让读者了解在大规模并发场景下如何保证系统的稳定性和性能。 **面试篇**包含了高并发场景下的...
工作流产品的标准化程度不高,导致不同产品间兼容性差,限制了其在关键业务流程中的应用。此外,现有工作流产品通常不适用于企业级规模,因为它们最初设计为小型协同工具,难以满足大规模、异构环境下的需求。它们的...
- **微服务架构**:服务发现、熔断、限流、降级等微服务治理策略。 6. **项目经验与实战能力** - **高并发处理**:设计和实现能处理大量并发请求的服务。 - **性能优化**:调优代码,提升系统响应速度和资源利用...
在.NET Core中,接口限流是一项重要的功能,用于保护服务免受恶意或高并发请求的冲击,从而确保系统的稳定性和性能。本文将深入探讨如何在.NET Core中设置接口限流,以及相关的技术实现。 首先,我们需要理解限流的...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具: IntelliJ IDEA + Navicat + ...
### 基于x86多核架构的数学函数扩展库设计与实现 #### 关键知识点解析 **一、背景及研究意义** 随着信息技术的飞速发展,特别是高性能计算领域的需求日益增长,多核并行计算技术应运而生。多核处理器能够显著提高...
标题中的“一款专门为SpringBoot项目设计的限流组件”指的是一个专门为基于Spring Boot框架的Web应用程序设计的流量控制工具。Spring Boot是Java生态系统中的一个流行框架,用于简化微服务开发,而限流组件则用于...
在处理亿级流量下的高并发系统时,分布式限流是一种关键技术,它能够有效保护后端服务系统免受突然增加的访问流量冲击,保证系统的稳定性。限流的核心目的是在特定时间窗口内,对系统接收到的请求进行数量上的控制,...
### Java后端技术面试知识点汇总 #### 一、Java基础篇 **1.1 Java基础** - **面向对象的特征**:面向对象编程的核心特征包括继承、封装和多态。 - **继承**:允许一个类继承另一个类的属性和方法。 - **封装**...
- **流控**:在高并发场景下,通过限流措施防止系统过载,常见的方法包括请求排队、告警或丢弃等。 - **Socket连接管理**:通过短连接、长连接等方式管理网络连接,其中长连接有助于减少连接建立和关闭的时间开销。 ...
4. **测试与优化**:进行单元测试、压力测试等,确保系统在高并发环境下的稳定运行。 通过以上步骤,我们不仅能够构建出一个功能完备的应用程序后端,还能确保其具有较高的可用性和安全性,为用户提供优质的使用...
通过以上介绍,我们可以看到设计和实现一个高并发、高性能的秒杀系统并非易事,它不仅涉及到多种技术的选择与应用,还需要深入理解业务流程并不断进行优化调整。希望本文能够帮助开发者们更好地应对这类挑战,构建出...
- API Gateway:作为统一入口,处理请求路由、认证、限流等。 以上只是Java高并发解决思路的一部分,实际应用中还需要结合具体业务场景和性能需求进行选择和优化。"高并发web架构.pdf"文档中的实例将进一步细化...
本篇文章将深入探讨基于SpringBoot构建的高并发商城秒杀系统,以及票务后端系统的设计理念和技术实现。 首先,SpringBoot作为Java开发中的主流框架,以其简洁的配置和快速的启动能力,极大地提升了开发效率。在秒杀...
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime ...
为了实现动态限流,我们可以结合Redis的分布式锁或者原子操作来控制并发请求的数量。 集成Redis实现限流,可以创建一个限流策略,例如基于每个服务实例的QPS(每秒请求数)。当请求到达时,网关会检查Redis中的...
后端限流使用令牌桶算法(如Guava的RateLimiter)进行限流。 库存预热在服务启动时将秒杀相关信息加载到Redis中,商品库存的删减在Redis中进行。 消息队列使用RabbitMQ缓冲过量流量,将同步操作转换成异步推送。 ...