提高接口并发量,防止崩溃

2023-11-11

思路:对高并发的接口,单独配置线程池。需考虑线程池内的线程数量,以及tomcat总线程数量与CPU的关系。

线程池的配置

接口如何配置单独的线程池

异步任务 @Async(“myExecutors”)

对实时性要求高的

分析下:实时就是同步,每一次请求就是一条线程,高并发就意味着同时运行大量线程,大量线程意味着对CPU时间片的抢夺会变多,导致CPU使用率飙升,同时IO运算较多也会导致内存占用飙升。总结一下就是,单机是有瓶颈的,我们要测出单机的并发瓶颈,然后使用多机部署(集群or微服务)

QPS://todo

TPS://todo

怎么集群

//todo

怎么微服务

//todo

对实时性要求不高的

⑴ 设置接口幂等性,返回唯一ID,让调用方通过ID查询此次的运行结果(这里用UUID标识的唯一ID,正式项目用 SnowFlake)

    @ApiOperation("测试SUCCESS")
    @RequestMapping("/success")
    @WebLog(description = "请求了测试接口")
    @Async("myExecutors")
    public ResultVo testSuccess(@ApiParam("入参") @RequestBody TestVo testVo) {
        //业务逻辑处理
        String resultCode = service.run();
        return new ResultVo(resultCode, testVo.getID());
    }

(2)提供回调,调用方传入需要回调的接口地址,待异步执行后,把结果返回

@ApiOperation("测试SUCCESS")
@RequestMapping("/success")
@WebLog(description = "请求了测试接口")
@Async("myExecutors")
public void testSuccess(@ApiParam("入参") @RequestBody TestVo testVo) {
         //业务逻辑处理
        String resultCode = service.run();
    	//结果回调
    	AsyncUtil.callBack(testVo.getUrl(),new ResultVo(ResultEnum.SUCCESS, testVo.getID()));
}

线程池的选择

  • 使用ThreadPoolExecutor,不要用Executors,具体原因网上搜,一堆

  • BlockingQueue对应三种,ArrayBlockingQuere:需要自己设置队列的容量,队列满了以后,将会开始创建maxPoolSize允许的线程数;LinkedBlockingQueue:队列的容量默认设置成了Integer.MaxValue;SynchronousQueue:不存储元素的队列,会直接给线程,使用它的话,线程数量很容易达到maxPoolSize;

单个线程池的线程数量设置

不要相信什么CPU数量+1,CPU数量 X 2 这种公式

理应通过排查当前服务器cpu使用率和负载,对要使用线程的任务进行压测,通过不断的调整CPU使用率和线程数,达到一个领自己满意的数值,这才是最适合的线程数量,如果非要给一个初始值,那么就是核的数量吧,然后反复调整,确定最终的值。

top:命令查询cpu使用率

cpuinfo:文件里查看核心数

线程总数量和CPU的关系

linux中,对于进程所拥有的的线程数有限制,一个进程最大线程数为1024

Tomcat和请求的关系

#最大队列数
server.tomcat.accept-count=100
#最大链接数
server.tomcat.max-connections=8192
#最大线程数
server.tomcat.max-threads=100
  • tomcat的最大线程数,可以决定同时处理客户端的请求数量。
  • 最大连接数一定要大于最大线程数,否则会有很多请求无响应
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高接口并发量,防止崩溃 的相关文章

随机推荐

  • 私有化部署即时通讯平台,完美替代飞书和钉钉的SaaS系统

    在当今快速发展的数字化时代 企业对于安全 灵活 可定制的即时通讯平台需求不断增长 作为一家领先的品牌 WorkPlus专注于提供私有化部署的即时通讯平台 完美替代飞书和钉钉的SaaS系统 本文将重点介绍WorkPlus如何通过创新的解决方案
  • iOS开发中的敏捷方法

    敏捷开发是现在比较流行的软件开发方法 因为方法决定效率 好的方法可以大大地提高开发效率 什么是敏捷 Agile 敏捷源于2001年美国犹他州雪鸟滑雪圣地的一次聚会 聚会是敏捷方法发起者和实践者的聚会 他们经过两天的讨论 通一份简明扼要的 敏
  • ExtJS Sencha CMD 打包异常报错分析处理 - 2

    今天使用 sencha app build testing 进行编译 然后运行的时候 出现错误 app js dc 1666874035180 81578 Uncaught TypeError t 1 is not a function a
  • yar框架的并行原理分析(libcurl+epoll)

    yar是一个轻量级的php rpc框架 有意思的是它的并行 其实就是libcurl作为网络库提供http请求 然后用epoll做为事件监听来实现整个异步并行调用的 在此基础上 就是如何利用zend api来对整个逻辑的封装了 我们先抛开ze
  • 平衡小车调试总结及心得

    目录 一 知识点 1 PID控制算法 2 平衡原理 二 硬件 1 编码器 2 电机 3 PWM 4 陀螺仪MPU6050 三 PID调节过程 1 理论部分 1 1直立环 1 2速度环 串级PID 1 3 纯比例控制 2 调参步骤 2 1大致
  • sql注入之万能密码总结

    sql注入之万能密码总结 万能密码 万能密码原理 万能密码 asp aspx万能密码 PHP万能密码 jsp 万能密码 万能密码 啊这 一般用来ctf登录的时候试试 这是sqli labs用的时候 我来记录一下 万能密码原理 原验证登陆语句
  • Python基础——函数的基本使用

    文章目录 一 定义 二 属性 三 操作 1 函数的参数 2 函数返回值 3 函数多个返回值 4 多个return语句 5 函数调用函数 6 函数的联系及注释 7 局部变量和全局变量 8 数据的传递 9 lambda表达式 一 定义 1 语法
  • 【TensorFlow】TensorFlow函数精讲之 tf.nn.relu()

    tf nn relu 函数是将大于0的数保持不变 小于0的数置为0 函数如图1所示 ReLU函数是常用的神经网络激活函数之一 图1 ReLU函数图像 下边为ReLU例子 import tensorflow as tf v tf consta
  • 自动控制原理与动态系统的建模与分析

    1 开环系统和闭环系统 反馈控制 1 1开环控制 开环控制系统是指无被控量反馈的系统 即在系统中控制信息的流动未形成闭合回路 1 2 闭环控制 有被控量反馈的控制 即系统的输出信号沿反馈通道又回到系统的输入端 构成闭合通道 也叫做反馈控制
  • go get国内解决办法汇总

    go作为Google大佬的亲儿子 go开发过程中除了SDK自带的包外还经常会需要用到大佬提供的其他包 这些包都在golang org下 而下载这些包需要访问大佬的服务器 国内开发者就会遇到各种的问题 今天就给大家总结一下有哪些途径安装这些包
  • Android Studio Flutter 开发配置

    近来比较闲 就研究下Flutter 开发 在此记录下studio 配置过程 时间是2023 7 19 在 Windows 操作系统上安装和配置 Flutter 开发环境 1 首先下载 Flutter SDKhttps storage flu
  • 基于51单片机水塔水箱液水位WIFI监控报警设计proteus仿真原理图PCB

    功能 0 本项目采用STC89C52作为单片机系统的控制MCU 1 WIFI实时上传当前水位状态 2 通过液位传感器检测液位 检测到最低液位和最高液位时 超过设定阈值将声光报警 3 通过状态指示灯显示当前液位情况 三种颜色 红色代表低于下限
  • python urllib下载文件怎么停止_python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况 最常用的方法就是通过Http利用urllib或者urllib2模块 当然你也可以利用ftplib从ftp站点下载文件 此外Python还提供了另外一种方法requests 下面来看看三种方法是如何
  • unity利用高阶贝塞尔曲线进行的轨道移动

    之前想做一个按照固定的路线进行移动的demo 就想到了路径的曲线 然后就想到了贝塞尔曲线 先上贝塞尔通用公式 借鉴网上的代码和相应的函数公式 组成了一个demo 通用的贝塞尔曲线工具类 using System Collections us
  • elasticsearch基础6——head插件安装和web页面查询操作使用、ik分词器

    文章目录 一 基本了解 1 1 插件分类 1 2 插件管理命令 二 分析插件 2 1 es中的分析插件 2 1 1 官方核心分析插件 2 1 2 社区提供分析插件 2 2 API扩展插件 三 Head 插件 3 1 安装 3 2 web页面
  • Python 基础知识5 元组操作

    元组 与列表不同之处 1 使用 定义 2 定以后元组的元素不能修改 元组定义 只有一个元素时元素后加 号 否则为整型 tup1 hello world 120 123 tup2 1 5 4 2 3 tup3 a b c d tup4 pri
  • Maven项目中读取src/main/resources目录下的配置文件

    在Maven项目的开发中 当需要读取src 下的配置文件时 该怎么做 我们假设Resources下有一个文件名为kafka properties的配置文件 为什么用kafka properties 因为这是在做kafka项目的时候碰到的问题
  • global::System.Runtime.Versioning.TargetFrameworkAttribute 特性重复

    visual studio code 反编译 报错 global System Runtime Versioning TargetFrameworkAttribute 特性重复 在 csproj文件内添加
  • itk.js读取.nii.gz文件,vtk.js进行渲染

    我们只需要用到itk中的 readImageArrayBuffer 从这个api我们可以看出 我们需要的是一个ArrayBuffer的数据 那么 我们通过 vtk js中的vtkHttpDataAccessHelper的方法把数据转换成Ar
  • 提高接口并发量,防止崩溃

    思路 对高并发的接口 单独配置线程池 需考虑线程池内的线程数量 以及tomcat总线程数量与CPU的关系 线程池的配置 接口如何配置单独的线程池 异步任务 Async myExecutors 对实时性要求高的 分析下 实时就是同步 每一次请