知識梳理
- 一、性能壓測的基本名額
-
- 1. 基本概念
- 2. 性能壓測工具JMeter
-
- 2.1 JMeter的下載下傳與啟動
- 2.2 JMeter的使用
-
- 2.2.1 添加線程組
- 2.2.2 測試HTTP請求
- 2.2.3 名額檢視
- 2.2.4 進行壓測
- 2.2.4 Windows下JMeter的BUG解決
- 2.3 jvisualvm的使用(jconsole基本不用了,是以就不說了)
-
- 2.3.1 jvisualvm的啟動與基本使用
- 2.3.1 jvisualvm的GC插件安裝
- 二、CompletableFuture異步編排
-
- 1. 啟動異步任務
-
- 1.1 四種方式
- 1.2 舉例說明
-
- 1.2.1 方式二
- 1.2.2 方式四
- 2. 完成時感覺
-
- 2.1 四種方式
- 2.2 舉例
-
- 2.2.1 whenComplete
- 2.2.2 exceptionally
- 3. 完成時處理
-
- 3.1 三種方式
- 3.2 舉例
- 4. 線程串行化
-
- 4.1 九種方式
- 4.2 舉例
-
- 4.2.1 thenrun
- 4.2.2 thenAccept
- 4.2.3 thenApply
- 5. 兩任務組(一)
-
- 5.1 九種方式
- 5.2 舉例
-
- 5.2.1 runAfterBothAsync
- 5.2.2 thenAcceptBothAsync
- 5.2.3 thenACombineAsync
- 6. 兩任務組合(二)
-
- 6.1 九種方式
- 6.2 舉例
-
- 6.2.1 runAfterEitherAsync
- 6.2.2 acceptEitherAsync
- 6.2.3 applyToEitherAsync
- 7. 多任務組合
-
- 7.1 兩種方式
- 7.2 舉例
-
- 7.2.1 allof
- 7.2.2 anyof
- 三、定時任務
-
- 1 cron表達式
-
- 1.1 基本文法
- 1.2 通配符
- 2 SpringBoot整合定時任務
-
- 2.1 整合步驟
- 2.2 SpringBoot和其他定時任務架構的差別
一、性能壓測的基本名額
1. 基本概念
- 響應時間(Response Time: RT):響應時間指使用者從用戶端發起一個請求開始,到用戶端接收到從伺服器端傳回的響應結束,整個過程所耗費的時間。
- HPS(Hits Per Second):每秒點選次數,機關是次/秒。
- TPS(Transaction per Second):系統每秒處理交易數,機關是筆/秒。
- QPS(Query per Second):系統每秒處理查詢次數,機關是次/秒。
- 最大響應時間(Max Response Time) 指使用者送出請求或者指令到系統做出反應(響應)的最大時間。
- 最少響應時間(Mininum ResponseTime) 指使用者送出請求或者指令到系統做出反應(響應)的最少時間。
- 90%響應時間(90% Response Time) 是指所有使用者的響應時間進行排序,第 90%的響應時間。
從外部看,性能測試主要關注如下三個名額:① 吞吐量:每秒鐘系統能夠處理的請求數、任務數。② 響應時間:服務處理一個請求或一個任務的耗時。③ 錯誤率:一批請求中結果出錯的請求所占比例。
2. 性能壓測工具JMeter
2.1 JMeter的下載下傳與啟動
進入官網:https://jmeter.apache.org/download_jmeter.cgi進行下載下傳。
點選jmeter.bat啟動JMeter。
2.2 JMeter的使用
2.2.1 添加線程組
- 線程數:虛拟使用者數。一個虛拟使用者占用一個程序或線程。設定多少虛拟使用者數在這裡也就是設定多少個線程數。
- Ramp-Up Period(in seconds)準備時長:設定的虛拟使用者數需要多長時間全部啟動。如果線程數為10,準備時長為2,那麼需要2秒鐘啟動10個線程,也就是每秒鐘啟動5個線程。
- 循環次數:每個線程發送請求的次數。如果線程數為10,循環次數為100,那麼每個線程發送100次請求。總請求數為10*100=1000 。如果勾選了“永遠”,那麼所有線程會一直發送請求,一到選擇停止運作腳本。
2.2.2 測試HTTP請求
2.2.3 名額檢視
2.2.4 進行壓測
先清空全部,再進行測試。
2.2.4 Windows下JMeter的BUG解決
- 問題:Windows本身提供的端口通路機制會引發一定的問題,由于Windows提供給TCP/IP連結的端口為1024-5000,并且要四分鐘來循環回收他們,這就導緻我們在短時間内跑大量的請求時會将端口占滿。
-
解決:
① windows+r中,用regedit指令打開系統資料庫。
② 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。
③ 右擊parameters,添加一個新的DWORD,名字為MaxUserPort。輕按兩下該DWORD,輸入數值資料為65534,基數選擇十進制。
④ 右擊parameters,添加一個新的DWORD,名字為TCPTimedWaitDelay。輕按兩下該DWORD,輸入數值資料為30,基數選擇十進制。
⑤ 修改配置完畢之後記得重新開機機器才會生效。
2.3 jvisualvm的使用(jconsole基本不用了,是以就不說了)
2.3.1 jvisualvm的啟動與基本使用
cmd視窗中,直接輸入jvisualvm即可。
想要對哪個程序進行分析,直接輕按兩下該程序即可。
2.3.1 jvisualvm的GC插件安裝
點選插件。
找到Visual GC,點選安裝,不斷下一步,直到完成即可。
重新開機jvisualvm即可。
二、CompletableFuture異步編排
1. 啟動異步任務
1.1 四種方式
1.方式一:運作指定的Runnable線程(無傳回值)
2.方式二:在指定線程池中運作指定的Runnable線程(無傳回值)
3.方式三:執行指定的異步任務(有傳回值)
4.方式四:在指定線程池中執行指定的異步任務(有傳回值)
1.2 舉例說明
1.2.1 方式二
1.2.2 方式四
2. 完成時感覺
2.1 四種方式
1.whenComplete:執行完目前任務後,使用執行目前任務的線程繼續處理正常和異常的計算結果,但不可傳回,lambda表達式參數為結果和發生的異常。
2.whenCompleteAsync:執行完目前任務後,将後續處理送出給線程池來處理正常和異常的計算結果,但不可傳回,lambda表達式參數為結果和發生的異常。
3.exceptionally:lambda表達式參數為發生的異常,可以捕獲異常并進行相應的處理并傳回。
4.注解:方法不以Async結尾,意味着Action使用相同的線程執行,而Async可能會使用其他線程執行(如果是使用相同的線程池,也可能會被同一個線程選中執行)。
2.2 舉例
2.2.1 whenComplete
2.2.2 exceptionally
3. 完成時處理
3.1 三種方式
lambda表達式參數為結果和發生的異常,可以對結果和異常進行處理,并根據需求決定如何傳回。
3.2 舉例
4. 線程串行化
4.1 九種方式
1.thenRun方法:隻要上面的任務執行完成,就開始執行thenRun,隻是處理完任務後,執行thenRun的後續操作。
2.thenAccept方法:消費處理結果。接收任務的處理結果,并消費處理,無傳回結果,lambda表達式參數為上一個任務的處理結果。
3.thenApply方法:當一個線程依賴另一個線程時,擷取上一個任務傳回的結果,并傳回目前任務的傳回值,lambda表達式參數為上一個任務的處理結果。
4.2 舉例
4.2.1 thenrun
4.2.2 thenAccept
4.2.3 thenApply
5. 兩任務組(一)
5.1 九種方式
兩個任務必須都完成,才觸發該任務:
1.runAfterBoth:組合兩個future,不需要擷取future的結果,隻需兩個future處理完任務後,處理該任務,并無傳回值。
2.thenAcceptBoth:組合兩個future,擷取兩個future任務的傳回結果,然後處理任務,并無傳回值。
3.thenCombine:組合兩個future,擷取兩個future的傳回結果,并傳回目前任務的傳回值。
5.2 舉例
5.2.1 runAfterBothAsync
5.2.2 thenAcceptBothAsync
5.2.3 thenACombineAsync
6. 兩任務組合(二)
6.1 九種方式
當兩個任務中,任意一個future任務完成的時候,執行任務:
1.runAfterEither:兩個任務有一個執行完成,不需要擷取future的結果,處理任務,也沒有傳回值。
2.acceptEither:兩個任務有一個執行完成,擷取它的傳回值(要求兩任務傳回值類型一樣),處理任務,沒有新的傳回值。
3.applyToEither:兩個任務有一個執行完成,擷取它的傳回值(要求兩任務傳回值類型一樣),處理任務并有新的傳回值。
6.2 舉例
6.2.1 runAfterEitherAsync
6.2.2 acceptEitherAsync
6.2.3 applyToEitherAsync
7. 多任務組合
7.1 兩種方式
1.allOf:等待所有任務完成。
2.anyOf:隻要有一個任務完成。
7.2 舉例
7.2.1 allof
7.2.2 anyof
三、定時任務
1 cron表達式
1.1 基本文法
- 基本文法:秒 分 時 日 月 周 年
1.2 通配符
-
:枚舉,比如(cron=“7,9,23 * * * * ?”)表示任意時刻的7、9、23秒啟動這個任務。,
-
:範圍,比如(cron=“7-20 * * * * ?”)表示任意時刻的7-20秒之間,每秒啟動一次。-
-
:任意,表示指定位置的任意時刻都可以。*
-
:步長,比如(cron=“7/5 * * * * ?”)表示第7秒啟動,每5秒一次;再比如(cron=“*/5 * * * * ?”)表示任意秒啟動,每5秒一次。/
-
?
:出現在日和周幾的位置,用來防止日和周沖突,在周和日上如果要寫通配符使
用
,比如(cron=“* * * 1 * ?”)表示每月的1号(無論周幾),啟動這個任務。?
-
:出現在日和周的位置,表示last即最後一個,比如(cron=“* * * ? * 3L”)表示每月的最後一個周二。L
-
:表示Work Day即工作日,比如(cron=“* * * W * ?”)表示每個月的工作日觸發;再比如(cron=“* * * LW * ?”)表示每個月的最後一個工作日觸發。W
-
:表示第幾個,比如(cron=“* * * ? * 5#2”)表示每個月的第2個周的周四。#
2 SpringBoot整合定時任務
2.1 整合步驟
- 在定時任務類上标注注解
将其注冊到容器中。@Component
- 在定時任務類上标注注解
注解,表示開啟定時任務。@EnableScheduling
- 在定時任務類中的方法上标注注解
,并設定其屬性@Scheduled
為cron表達式,來指定該方法的定時執行時間。cron
2.2 SpringBoot和其他定時任務架構的差別
- SpringBoot不支援cron表達式中的年的設定(cron表達式的年本身也是可選項)。
- SpringBoot的cron表達式中的周的設定中1-7代表周一到周日,而傳統cron表達式1-7代表周日到周一。
- SpringBoot中的定時任務預設是阻塞的,但通常情況下,定時任務不能阻塞。對此,有三種解決方式:① 使用異步編排,利用CompletableFuture讓業務以異步的方式是運作來解決定時任務的阻塞。② 使用定時任務預設會采用SpringBoot支援的定時任務線程池,其線程池中線程個數預設為1,我們可以通過修改配置檔案
中的application.properties
屬性将其支援的線程池的線程數調大來解決定時任務的阻塞,但是此種設定容易失效,部分版本有效。③ 采用異步任務,讓定時任務異步執行,需要在定時任務類上标注注解spring.task.scheduling.pool.size
開啟異步任務功能,并在定時任務方法上标注注解@EnableAsync
即可。SpringBoot預設為該任務建立并注冊的的線程池核心線程數為8,最大線程數為Integer.MAX,我們需要在配置檔案@Async
中修改application.properties
和spring.task.execution.pool.core-size
來進行人為更改。(普通業務邏輯也可以這樣開啟異步任務功能)。spring.task.execution.pool.max-size