天天看點

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

知識梳理

  • 一、性能壓測的基本名額
    • 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進行下載下傳。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

點選jmeter.bat啟動JMeter。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.2 JMeter的使用

2.2.1 添加線程組

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
  • 線程數:虛拟使用者數。一個虛拟使用者占用一個程序或線程。設定多少虛拟使用者數在這裡也就是設定多少個線程數。
  • Ramp-Up Period(in seconds)準備時長:設定的虛拟使用者數需要多長時間全部啟動。如果線程數為10,準備時長為2,那麼需要2秒鐘啟動10個線程,也就是每秒鐘啟動5個線程。
  • 循環次數:每個線程發送請求的次數。如果線程數為10,循環次數為100,那麼每個線程發送100次請求。總請求數為10*100=1000 。如果勾選了“永遠”,那麼所有線程會一直發送請求,一到選擇停止運作腳本。

2.2.2 測試HTTP請求

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.2.3 名額檢視

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.2.4 進行壓測

先清空全部,再進行測試。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

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即可。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

想要對哪個程序進行分析,直接輕按兩下該程序即可。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.3.1 jvisualvm的GC插件安裝

點選插件。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

找到Visual GC,點選安裝,不斷下一步,直到完成即可。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

重新開機jvisualvm即可。

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

二、CompletableFuture異步編排

1. 啟動異步任務

1.1 四種方式

1.方式一:運作指定的Runnable線程(無傳回值)

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.方式二:在指定線程池中運作指定的Runnable線程(無傳回值)

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

3.方式三:執行指定的異步任務(有傳回值)

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

4.方式四:在指定線程池中執行指定的異步任務(有傳回值)

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

1.2 舉例說明

1.2.1 方式二

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

1.2.2 方式四

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2. 完成時感覺

2.1 四種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

1.whenComplete:執行完目前任務後,使用執行目前任務的線程繼續處理正常和異常的計算結果,但不可傳回,lambda表達式參數為結果和發生的異常。

2.whenCompleteAsync:執行完目前任務後,将後續處理送出給線程池來處理正常和異常的計算結果,但不可傳回,lambda表達式參數為結果和發生的異常。

3.exceptionally:lambda表達式參數為發生的異常,可以捕獲異常并進行相應的處理并傳回。

4.注解:方法不以Async結尾,意味着Action使用相同的線程執行,而Async可能會使用其他線程執行(如果是使用相同的線程池,也可能會被同一個線程選中執行)。

2.2 舉例

2.2.1 whenComplete

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

2.2.2 exceptionally

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

3. 完成時處理

3.1 三種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

lambda表達式參數為結果和發生的異常,可以對結果和異常進行處理,并根據需求決定如何傳回。

3.2 舉例

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

4. 線程串行化

4.1 九種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

1.thenRun方法:隻要上面的任務執行完成,就開始執行thenRun,隻是處理完任務後,執行thenRun的後續操作。

2.thenAccept方法:消費處理結果。接收任務的處理結果,并消費處理,無傳回結果,lambda表達式參數為上一個任務的處理結果。

3.thenApply方法:當一個線程依賴另一個線程時,擷取上一個任務傳回的結果,并傳回目前任務的傳回值,lambda表達式參數為上一個任務的處理結果。

4.2 舉例

4.2.1 thenrun

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

4.2.2 thenAccept

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

4.2.3 thenApply

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

5. 兩任務組(一)

5.1 九種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

兩個任務必須都完成,才觸發該任務:

1.runAfterBoth:組合兩個future,不需要擷取future的結果,隻需兩個future處理完任務後,處理該任務,并無傳回值。

2.thenAcceptBoth:組合兩個future,擷取兩個future任務的傳回結果,然後處理任務,并無傳回值。

3.thenCombine:組合兩個future,擷取兩個future的傳回結果,并傳回目前任務的傳回值。

5.2 舉例

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

5.2.1 runAfterBothAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

5.2.2 thenAcceptBothAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

5.2.3 thenACombineAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

6. 兩任務組合(二)

6.1 九種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

當兩個任務中,任意一個future任務完成的時候,執行任務:

1.runAfterEither:兩個任務有一個執行完成,不需要擷取future的結果,處理任務,也沒有傳回值。

2.acceptEither:兩個任務有一個執行完成,擷取它的傳回值(要求兩任務傳回值類型一樣),處理任務,沒有新的傳回值。

3.applyToEither:兩個任務有一個執行完成,擷取它的傳回值(要求兩任務傳回值類型一樣),處理任務并有新的傳回值。

6.2 舉例

6.2.1 runAfterEitherAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

6.2.2 acceptEitherAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

6.2.3 applyToEitherAsync

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

7. 多任務組合

7.1 兩種方式

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

1.allOf:等待所有任務完成。

2.anyOf:隻要有一個任務完成。

7.2 舉例

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

7.2.1 allof

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

7.2.2 anyof

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務

三、定時任務

1 cron表達式

1.1 基本文法

谷粒商城進階(一)複習知識一、性能壓測的基本名額二、CompletableFuture異步編排三、定時任務
  • 基本文法:秒 分 時 日 月 周 年

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号(無論周幾),啟動這個任務。
  • L

    :出現在日和周的位置,表示last即最後一個,比如(cron=“* * * ? * 3L”)表示每月的最後一個周二。
  • W

    :表示Work Day即工作日,比如(cron=“* * * W * ?”)表示每個月的工作日觸發;再比如(cron=“* * * LW * ?”)表示每個月的最後一個工作日觸發。
  • #

    :表示第幾個,比如(cron=“* * * ? * 5#2”)表示每個月的第2個周的周四。

2 SpringBoot整合定時任務

2.1 整合步驟

  1. 在定時任務類上标注注解

    @Component

    将其注冊到容器中。
  2. 在定時任務類上标注注解

    @EnableScheduling

    注解,表示開啟定時任務。
  3. 在定時任務類中的方法上标注注解

    @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

    開啟異步任務功能,并在定時任務方法上标注注解

    @Async

    即可。SpringBoot預設為該任務建立并注冊的的線程池核心線程數為8,最大線程數為Integer.MAX,我們需要在配置檔案

    application.properties

    中修改

    spring.task.execution.pool.core-size

    spring.task.execution.pool.max-size

    來進行人為更改。(普通業務邏輯也可以這樣開啟異步任務功能)。

繼續閱讀