系统限流实践 - 应用限流

本文介绍了应用级别的限流实践,包括针对容器限制并发/连接/请求数,接口并发控制,时间窗口限流以及平滑限流接口请求数。通过Java的Atomic和Guava Cache实现不同粒度的限流,同时探讨了令牌桶算法在平滑限流中的应用。这些方法在简单的场景和复杂微服务环境中各有适用范围。
摘要由CSDN通过智能技术生成

本文是根据开涛的博客 聊聊高并发系统之限流特技-1 整理而成,自学笔记第二篇

目录

1.系统限流实践 - 理论篇
2.系统限流实践 - 应用限流
3.系统限流实践 - 分布式限流
4.系统限流实践 - 接入层限流(上)
5.系统限流实践 - 接入层限流(下*完结)

开篇

上篇学习了限流的基本知识(传送门),接下来学习一下应用限流的方法

应用级限流

针对容器限制总并发/连接/请求数

通过对容器进行配置,限制TPS/QPS阀值,防止大量请求涌入击垮系统。

如果你使用过Tomcat,其Connector 其中一种配置有如下几个参数:
acceptCount:如果Tomcat的线程都忙于响应,新来的连接会进入队列排队,如果超出排队大小,则拒绝连接;
maxConnections:瞬时最大连接数,超出的会排队等待;
maxThreads:Tomcat能启动用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死
详细的配置请参考官方文档。另外如Mysql(如max_connections)、Redis(如tcp-backlog)都会有类似的限制连接数的配置

针对接口进行并发控制

如果担心接口某个时刻并发量过大了,可以细粒度地限制每个接口的总并发/请求数
可以使用Java得Atomic来实现

public class SimpleLimit {
   

     private AtomicInteger requestCount;

     public void doRequest(String threadName) {
         try {
             if (requestCount.decrementAndGet() < 0) {
                 System.out.println(threadName + ":请求过多,请稍后再尝试");
             }else {
                 System.out.println(threadName + ":您的请求已受理");
             }
         } finally {
             requestCount.incrementAndGet();
         }
     }
     ......
}

测试代码

public static void main(String[] args) throws InterruptedException, IOException {
        final SimpleLimit simpleLimit = new SimpleLimit();
        final CountDownLatch latch = new CountDownLatch(1); //保证线程同一时刻start
        simpleLimit.requestCount = new AtomicInteger(10);
        for (int i = 0; i < 50; i++) {
            final int finalI = i;
            Thread t = new Thread(new
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值