網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
思路:對(duì)高并發(fā)的接口,單獨(dú)配置線程池。需考慮線程池內(nèi)的線程數(shù)量,以及tomcat總線程數(shù)量與CPU的關(guān)系。
線程池的配置
接口如何配置單獨(dú)的線程池
異步任務(wù) @Async(“myExecutors”)
對(duì)實(shí)時(shí)性要求高的
分析下:實(shí)時(shí)就是同步,每一次請(qǐng)求就是一條線程,高并發(fā)就意味著同時(shí)運(yùn)行大量線程,大量線程意味著對(duì)CPU時(shí)間片的搶奪會(huì)變多,導(dǎo)致CPU使用率飆升,同時(shí)IO運(yùn)算較多也會(huì)導(dǎo)致內(nèi)存占用飆升。總結(jié)一下就是,單機(jī)是有瓶頸的,我們要測(cè)出單機(jī)的并發(fā)瓶頸,然后使用多機(jī)部署(集群or微服務(wù))
QPS://todo
TPS://todo
怎么集群
//todo
怎么微服務(wù)
//todo
對(duì)實(shí)時(shí)性要求不高的
⑴ 設(shè)置接口冪等性,返回唯一ID,讓調(diào)用方通過(guò)ID查詢此次的運(yùn)行結(jié)果(這里用UUID標(biāo)識(shí)的唯一ID,正式項(xiàng)目用 SnowFlake)
@ApiOperation("測(cè)試SUCCESS")
@RequestMapping("/success")
@WebLog(description = "請(qǐng)求了測(cè)試接口")
@Async("myExecutors")
public ResultVo testSuccess(@ApiParam("入?yún)?) @RequestBody TestVo testVo) {
//業(yè)務(wù)邏輯處理
String resultCode = service.run();
return new ResultVo(resultCode, testVo.getID());
}
(2)提供回調(diào),調(diào)用方傳入需要回調(diào)的接口地址,待異步執(zhí)行后,把結(jié)果返回
@ApiOperation("測(cè)試SUCCESS")
@RequestMapping("/success")
@WebLog(description = "請(qǐng)求了測(cè)試接口")
@Async("myExecutors")
public void testSuccess(@ApiParam("入?yún)?) @RequestBody TestVo testVo) {
//業(yè)務(wù)邏輯處理
String resultCode = service.run();
//結(jié)果回調(diào)
AsyncUtil.callBack(testVo.getUrl(),new ResultVo(ResultEnum.SUCCESS, testVo.getID()));
}
線程池的選擇
-
使用ThreadPoolExecutor,不要用Executors,具體原因網(wǎng)上搜,一堆
-
BlockingQueue對(duì)應(yīng)三種,ArrayBlockingQuere:需要自己設(shè)置隊(duì)列的容量,隊(duì)列滿了以后,將會(huì)開(kāi)始創(chuàng)建maxPoolSize允許的線程數(shù);LinkedBlockingQueue:隊(duì)列的容量默認(rèn)設(shè)置成了Integer.MaxValue;SynchronousQueue:不存儲(chǔ)元素的隊(duì)列,會(huì)直接給線程,使用它的話,線程數(shù)量很容易達(dá)到maxPoolSize;
單個(gè)線程池的線程數(shù)量設(shè)置
不要相信什么CPU數(shù)量+1,CPU數(shù)量 X 2 這種公式
理應(yīng)通過(guò)排查當(dāng)前服務(wù)器cpu使用率和負(fù)載,對(duì)要使用線程的任務(wù)進(jìn)行壓測(cè),通過(guò)不斷的調(diào)整CPU使用率和線程數(shù),達(dá)到一個(gè)領(lǐng)自己滿意的數(shù)值,這才是最適合的線程數(shù)量,如果非要給一個(gè)初始值,那么就是核的數(shù)量吧,然后反復(fù)調(diào)整,確定最終的值。
top:命令查詢cpu使用率
cpuinfo:文件里查看核心數(shù)
線程總數(shù)量和CPU的關(guān)系
linux中,對(duì)于進(jìn)程所擁有的的線程數(shù)有限制,一個(gè)進(jìn)程最大線程數(shù)為1024
Tomcat和請(qǐng)求的關(guān)系
#最大隊(duì)列數(shù)
server.tomcat.accept-count=100
#最大鏈接數(shù)
server.tomcat.max-connections=8192
#最大線程數(shù)
server.tomcat.max-threads=100
- tomcat的最大線程數(shù),可以決定同時(shí)處理客戶端的請(qǐng)求數(shù)量。
- 最大連接數(shù)一定要大于最大線程數(shù),否則會(huì)有很多請(qǐng)求無(wú)響應(yīng)
原文鏈接:https://blog.csdn.net/longqiyuye925/article/details/126980332
相關(guān)推薦
- 2022-06-23 VBS?批量Ping的項(xiàng)目實(shí)現(xiàn)_vbs
- 2022-07-11 Sonatype Nexus搭建Maven私服
- 2022-12-15 詳解C#中HttpClient的用法及相關(guān)問(wèn)題的解決方法_C#教程
- 2022-05-13 larvel8 批量刪除
- 2022-04-28 WPF依賴屬性用法詳解_實(shí)用技巧
- 2022-08-04 如何利用python實(shí)現(xiàn)列表嵌套字典取值_python
- 2022-05-08 SQL利用游標(biāo)遍歷日期查詢的過(guò)程詳解_MsSql
- 2022-07-12 Springboot Druid 啟動(dòng)報(bào)錯(cuò):Failed to configure a DataSo
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支