JAVA流控及超流控后的延迟处理实例

JAVA流控及超流控后的延迟处理实例

什么是流控和超流控?

在高并发时,可能会发生流量过大的情况,这时就需要对流量进行控制,以避免系统过载。流控就是对系统能处理的请求进行限制,保证系统能够正常运行。流量超出限制后,可能会发生系统宕机等问题,此时就需要超流控,对请求进行拦截处理。

如何进行流控和超流控?

可以通过设置速率限制、并发请求数等方式进行流控,在超过限制后,可以选择进行拒绝、延迟等超流控方法。

速率限制

使用Guava RateLimiter组件,可以对请求进行速率限制。

示例代码:

RateLimiter rateLimiter = RateLimiter.create(5);//每秒钟处理5个请求
...
if(rateLimiter.tryAcquire()){//尝试获取请求令牌
    //业务处理
}else{
    //流控,拒绝请求
}

并发请求数限制

使用Semaphore信号量,对并发请求数进行限制。

示例代码:

Semaphore semaphore = new Semaphore(10);//最多允许10个请求并发
...
try{
    semaphore.acquire();//获取信号量
    //业务处理
}catch(InterruptedException e){
    //异常处理
}finally{
    semaphore.release();//释放信号量
}

超流控

在流量超出限制后,可以选择拒绝请求或者对请求进行延迟处理。

拒绝请求

当请求超出限制后,直接返回错误响应。

示例代码:

if(concurrentRequests > MAX_CONCURRENT_REQUESTS){//超流控
    return Response.status(Status.SERVICE_UNAVAILABLE)
                   .entity("Too Many Requests")
                   .build();
}

延迟处理

当请求超出限制后,将请求存入队列中,延迟处理。

示例代码:

LinkedBlockingQueue<Runnable> requestQueue = new LinkedBlockingQueue<Runnable>();//请求队列
...
if(concurrentRequests > MAX_CONCURRENT_REQUESTS){//超流控
    return requestQueue.offer(new Runnable(){
        public void run(){
            //业务处理
        }
    });
}

案例分析

假设有一个在线购物网站,用户可以在该网站上浏览商品、下单和支付等操作。在高峰时段,可能会有大量用户同时访问该网站,这时就需要对请求进行流控和超流控。

流控

为了避免过多用户同时访问网站,可以设置并发请求数限制。

示例代码:

Semaphore semaphore = new Semaphore(100);//最多允许100个请求并发
try{
    semaphore.acquire();
    //业务处理
}catch(InterruptedException e){
    //异常处理
}finally{
    semaphore.release();
}

超流控

在并发请求数限制无法满足限制要求时,可以对请求进行拒绝或者延迟处理。

超流控 - 拒绝请求

当请求超出限制后,返回请求过多响应。

示例代码:

if(concurrentRequests > MAX_CONCURRENT_REQUESTS){//超流控
    return Response.status(Status.SERVICE_UNAVAILABLE)
                   .entity("Too Many Requests")
                   .build();
}

超流控 - 延迟处理

当请求超出限制后,将请求存入队列中,延迟处理。

示例代码:

LinkedBlockingQueue<Runnable> requestQueue = new LinkedBlockingQueue<Runnable>();//请求队列
...
if(concurrentRequests > MAX_CONCURRENT_REQUESTS){//超流控
    return requestQueue.offer(new Runnable(){
        public void run(){
            //业务处理
        }
    });
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA流控及超流控后的延迟处理实例 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • springboot启动后卡住无日志的几种情况小结

    下面是关于“SpringBoot启动后卡住无日志的几种情况小结”完整攻略: 问题背景 在使用SpringBoot开发JavaWeb应用时,有时候可能会遇到启动后卡住无日志的情况,导致我们无法知道整个启动过程的具体信息。这种情况通常有以下几种原因: 应用启动卡在某个点,等待某个线程执行完成 应用启动时出现了未捕获的异常 应用启动时依赖的外部服务出现了故障 接下…

    Java 2023年6月2日
    00
  • Xml中使用foreach遍历对象实现代码

    下面就为你详细讲解使用foreach遍历对象实现代码的攻略。 1. 前置条件 在Xml中使用foreach遍历对象,需要先了解以下几点: XML – Extensible Markup Language(可扩展标记语言) foreach循环语句 如何通过XPath表达式获取XML节点 2. 步骤 2.1 导入XML文件 首先,需要将XML文件读取到程序中,可…

    Java 2023年5月19日
    00
  • 使用java.nio.file 库优雅的操作文件详解

    使用Java.nio.file库可以实现优雅而高效的文件操作。Java.nio.file库提供了几个主要的类和方法,包括Path、Files和FileSystem等。下面详细讲解如何使用这些类和方法来完成文件操作。 Path类 Path类代表一个文件或目录的路径。可以通过Paths类的静态方法获取一个Path对象,例如: Path path = Paths.…

    Java 2023年5月20日
    00
  • JavaScript实现翻页功能(附效果图)

    下面是详细的“JavaScript实现翻页功能(附效果图)”完整攻略。 1. 准备工作 在实现之前,需要准备以下内容: HTML 页面中的内容需要做好分页。 在页面中添加用来显示翻页效果的 HTML 元素。 确定每页需要显示的数据数量。 翻页元素的样式。 2. 翻页效果实现步骤 接下来,我们开始实现 JavaScript 翻页功能。 2.1. 获取数据 首先…

    Java 2023年6月15日
    00
  • 详解Java并发编程基础之volatile

    下面我将详细讲解“详解Java并发编程基础之volatile”的攻略。首先,我们需要了解volatile的作用。 什么是volatile 在Java中,一个变量被声明为volatile,意味着它是一个“易变的”变量。它告诉编译器和JVM,这个变量在任何时刻都可能被其它线程修改,因此需要特别处理。 volatile的应用场景 volatile主要用于保证变量的…

    Java 2023年5月19日
    00
  • 原子操作的作用是什么?

    原子操作的作用 原子操作是指在执行时不能被中断,也不会被其他进程或线程插入执行,能够在一条指令周期内完成的操作。原子操作的作用就是保证多个并发任务同时访问同一资源时,保证数据一致性和完整性。 原子操作是实现并发控制的一种有效手段,其作用主要有以下两点: 原子操作可以保证多个线程并发操作同一资源时不会出现数据冲突和数据不一致的问题,从而确保程序的正确性和可靠性…

    Java 2023年5月10日
    00
  • IDEA工程运行时总是报xx程序包不存在实际上包已导入(问题分析及解决方案)

    问题背景 在使用 JetBrains 旗下的 Java IDE 工具 IntelliJ IDEA 进行项目开发时,有时会遇到一个问题:在导入了某些依赖库后,运行程序时提示某些类找不到或某些程序包不存在,但实际上这些包已经被正确导入了。 问题原因 这是因为 IntelliJ IDEA 默认会在编译、运行时根据 Maven、Gradle 或自己所设置的依赖路径自…

    Java 2023年5月26日
    00
  • 如何用idea数据库编写快递e站

    如何用IDEA数据库编写快递E站的完整攻略: 安装数据库和IDEA 首先需要安装数据库和IDEA,常用的数据库有MySQL和PostgreSQL。使用过程中也需要安装相应的驱动程序。如果你使用的是Maven或Gradle等构建工具,那么你可以在配置文件中添加相应的依赖项,自动下载驱动程序。 创建数据库和表格 在IDEA中连接到数据库服务器,创建一个新的数据库…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部