日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

提高接口并發(fā)量,防止崩潰

作者:老街俗人 更新時間: 2022-09-22 編程語言

思路:對高并發(fā)的接口,單獨配置線程池。需考慮線程池內(nèi)的線程數(shù)量,以及tomcat總線程數(shù)量與CPU的關(guān)系。

線程池的配置

接口如何配置單獨的線程池

異步任務(wù) @Async(“myExecutors”)

對實時性要求高的

分析下:實時就是同步,每一次請求就是一條線程,高并發(fā)就意味著同時運行大量線程,大量線程意味著對CPU時間片的搶奪會變多,導(dǎo)致CPU使用率飆升,同時IO運算較多也會導(dǎo)致內(nèi)存占用飆升。總結(jié)一下就是,單機是有瓶頸的,我們要測出單機的并發(fā)瓶頸,然后使用多機部署(集群or微服務(wù))

QPS://todo

TPS://todo

怎么集群

//todo

怎么微服務(wù)

//todo

對實時性要求不高的

⑴ 設(shè)置接口冪等性,返回唯一ID,讓調(diào)用方通過ID查詢此次的運行結(jié)果(這里用UUID標(biāo)識的唯一ID,正式項目用 SnowFlake)

    @ApiOperation("測試SUCCESS")
    @RequestMapping("/success")
    @WebLog(description = "請求了測試接口")
    @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("測試SUCCESS")
@RequestMapping("/success")
@WebLog(description = "請求了測試接口")
@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對應(yīng)三種,ArrayBlockingQuere:需要自己設(shè)置隊列的容量,隊列滿了以后,將會開始創(chuàng)建maxPoolSize允許的線程數(shù);LinkedBlockingQueue:隊列的容量默認(rèn)設(shè)置成了Integer.MaxValue;SynchronousQueue:不存儲元素的隊列,會直接給線程,使用它的話,線程數(shù)量很容易達(dá)到maxPoolSize;

單個線程池的線程數(shù)量設(shè)置

不要相信什么CPU數(shù)量+1,CPU數(shù)量 X 2 這種公式

理應(yīng)通過排查當(dāng)前服務(wù)器cpu使用率和負(fù)載,對要使用線程的任務(wù)進行壓測,通過不斷的調(diào)整CPU使用率和線程數(shù),達(dá)到一個領(lǐng)自己滿意的數(shù)值,這才是最適合的線程數(shù)量,如果非要給一個初始值,那么就是核的數(shù)量吧,然后反復(fù)調(diào)整,確定最終的值。

top:命令查詢cpu使用率

cpuinfo:文件里查看核心數(shù)

線程總數(shù)量和CPU的關(guān)系

linux中,對于進程所擁有的的線程數(shù)有限制,一個進程最大線程數(shù)為1024

Tomcat和請求的關(guān)系

#最大隊列數(shù)
server.tomcat.accept-count=100
#最大鏈接數(shù)
server.tomcat.max-connections=8192
#最大線程數(shù)
server.tomcat.max-threads=100
  • tomcat的最大線程數(shù),可以決定同時處理客戶端的請求數(shù)量。
  • 最大連接數(shù)一定要大于最大線程數(shù),否則會有很多請求無響應(yīng)

原文鏈接:https://blog.csdn.net/longqiyuye925/article/details/126980332

欄目分類
最近更新