`

高并发后端设计-限流篇

 
阅读更多
系统在设计之初就会有一个预估容量,长时间超过系统能承受的TPS/QPS阈值,系统可能会被压垮,最终导致整个服务不够用。为了避免这种情况,我们就需要对接口请求进行限流。

限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待。

常见的限流模式有控制并发和控制速率,一个是限制并发的数量,一个是限制并发访问的速率,另外还可以限制单位时间窗口内的请求数量。

控制并发数量
属于一种较常见的限流手段,在实际应用中可以通过信号量机制(如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
分享到:
评论

相关推荐

    计算机后端-Java-Java高并发从入门到面试教程-用限流思路.zip

    本教程"Java高并发从入门到面试教程"着重讲解了如何利用限流策略来优化系统性能,以应对大量并发请求。限流是系统架构设计中的重要组成部分,它能够防止系统因过量的请求而崩溃,同时保证服务的质量和响应时间。 ...

    微服务网关后端 1-8章 功能点演示代码.zip

    4. **熔断与降级**:在高并发或服务故障时,网关需要具备熔断和降级机制,如Hystrix提供的服务隔离、超时控制和断路器模式,以防止整个系统因单个服务的故障而崩溃。 5. **限流与熔断**:使用如Netflix的Zuul或...

    计算机后端-Java-Java高并发从入门到面试教程-务降级与服.zip

    本教程专注于Java高并发编程,这是现代软件系统设计中的关键部分,特别是在处理大量用户请求和服务之间交互时。"务降级与服务"是这个主题的一个重要概念,它涉及到在系统负载过高或者资源紧张时如何确保核心业务的...

    深入理解高并发编程-核心技术原理

    **实战案例篇**探讨了在亿级流量场景下如何实现分布式限流和HTTP接口限流,其中使用注解进行接口限流的方法被详细阐述,让读者了解在大规模并发场景下如何保证系统的稳定性和性能。 **面试篇**包含了高并发场景下的...

    计算机-后端-基于Web Service架构的工作流技术的研究及其应用.pdf

    工作流产品的标准化程度不高,导致不同产品间兼容性差,限制了其在关键业务流程中的应用。此外,现有工作流产品通常不适用于企业级规模,因为它们最初设计为小型协同工具,难以满足大规模、异构环境下的需求。它们的...

    大厂Golang开发工程师面试题集锦 后端 - Java.zip

    - **微服务架构**:服务发现、熔断、限流、降级等微服务治理策略。 6. **项目经验与实战能力** - **高并发处理**:设计和实现能处理大量并发请求的服务。 - **性能优化**:调优代码,提升系统响应速度和资源利用...

    net core 设置接口限流

    在.NET Core中,接口限流是一项重要的功能,用于保护服务免受恶意或高并发请求的冲击,从而确保系统的稳定性和性能。本文将深入探讨如何在.NET Core中设置接口限流,以及相关的技术实现。 首先,我们需要理解限流的...

    SpringBoot开发的高并发限时抢购秒杀系统

    本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具: IntelliJ IDEA + Navicat + ...

    计算机-后端-基于x86多核架构的数学函数扩展库设计与实现.pdf

    ### 基于x86多核架构的数学函数扩展库设计与实现 #### 关键知识点解析 **一、背景及研究意义** 随着信息技术的飞速发展,特别是高性能计算领域的需求日益增长,多核并行计算技术应运而生。多核处理器能够显著提高...

    一款专门为SpringBoot项目设计的限流组件

    标题中的“一款专门为SpringBoot项目设计的限流组件”指的是一个专门为基于Spring Boot框架的Web应用程序设计的流量控制工具。Spring Boot是Java生态系统中的一个流行框架,用于简化微服务开发,而限流组件则用于...

    亿级流量下的分布式限流解决方案.pdf

    在处理亿级流量下的高并发系统时,分布式限流是一种关键技术,它能够有效保护后端服务系统免受突然增加的访问流量冲击,保证系统的稳定性。限流的核心目的是在特定时间窗口内,对系统接收到的请求进行数量上的控制,...

    Java后端技术面试汇总-2019

    ### Java后端技术面试知识点汇总 #### 一、Java基础篇 **1.1 Java基础** - **面向对象的特征**:面向对象编程的核心特征包括继承、封装和多态。 - **继承**:允许一个类继承另一个类的属性和方法。 - **封装**...

    高并发高可用的可伸缩的架构设计的原则

    - **流控**:在高并发场景下,通过限流措施防止系统过载,常见的方法包括请求排队、告警或丢弃等。 - **Socket连接管理**:通过短连接、长连接等方式管理网络连接,其中长连接有助于减少连接建立和关闭的时间开销。 ...

    PHP开发高可用高安全App后端

    4. **测试与优化**:进行单元测试、压力测试等,确保系统在高并发环境下的稳定运行。 通过以上步骤,我们不仅能够构建出一个功能完备的应用程序后端,还能确保其具有较高的可用性和安全性,为用户提供优质的使用...

    PHP秒杀系统 高并发高性能的极致挑战-

    通过以上介绍,我们可以看到设计和实现一个高并发、高性能的秒杀系统并非易事,它不仅涉及到多种技术的选择与应用,还需要深入理解业务流程并不断进行优化调整。希望本文能够帮助开发者们更好地应对这类挑战,构建出...

    java 高并发解决 思路

    - API Gateway:作为统一入口,处理请求路由、认证、限流等。 以上只是Java高并发解决思路的一部分,实际应用中还需要结合具体业务场景和性能需求进行选择和优化。"高并发web架构.pdf"文档中的实例将进一步细化...

    基于springbooot的高并发商城秒杀系统源码,票务的后端系统

    本篇文章将深入探讨基于SpringBoot构建的高并发商城秒杀系统,以及票务后端系统的设计理念和技术实现。 首先,SpringBoot作为Java开发中的主流框架,以其简洁的配置和快速的启动能力,极大地提升了开发效率。在秒杀...

    基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统

    本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime ...

    网关 gateway 动态路由 及 redis 集成限流

    为了实现动态限流,我们可以结合Redis的分布式锁或者原子操作来控制并发请求的数量。 集成Redis实现限流,可以创建一个限流策略,例如基于每个服务实例的QPS(每秒请求数)。当请求到达时,网关会检查Redis中的...

    (源码)基于Spring Boot和Redis的高并发秒杀系统.zip

    后端限流使用令牌桶算法(如Guava的RateLimiter)进行限流。 库存预热在服务启动时将秒杀相关信息加载到Redis中,商品库存的删减在Redis中进行。 消息队列使用RabbitMQ缓冲过量流量,将同步操作转换成异步推送。 ...

Global site tag (gtag.js) - Google Analytics