AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

SpringBoot3虛擬線程 & 反應(yīng)式(WebFlux) & 傳統(tǒng)Tomcat線程池性能對(duì)比

來源: 責(zé)編: 時(shí)間:2024-02-01 12:49:24 229觀看
導(dǎo)讀環(huán)境:SpringBoot3.2.1 + JDK211. 簡介從Spring Boot 3.2 支持虛擬線程。要使用虛擬線程,需要在 Java 21 上運(yùn)行,并將屬性 spring.threads.virtual.enabled 設(shè)置為 true。啟用虛擬線程后,Tomcat 和 Jetty 將使用虛擬線程處

環(huán)境:SpringBoot3.2.1 + JDK21I8Y28資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

從Spring Boot 3.2 支持虛擬線程。要使用虛擬線程,需要在 Java 21 上運(yùn)行,并將屬性 spring.threads.virtual.enabled 設(shè)置為 true。I8Y28資訊網(wǎng)——每日最新資訊28at.com

啟用虛擬線程后,Tomcat 和 Jetty 將使用虛擬線程處理請(qǐng)求。這意味著處理網(wǎng)絡(luò)請(qǐng)求的應(yīng)用程序代碼(如控制器中的方法)將在虛擬線程上運(yùn)行。I8Y28資訊網(wǎng)——每日最新資訊28at.com

啟用虛擬線程后,applicationTaskExecutor Bean 將成為配置為使用虛擬線程的 SimpleAsyncTaskExecutor。任何使用應(yīng)用程序任務(wù)執(zhí)行器的地方,如調(diào)用 @Async 方法時(shí)的 @EnableAsync、Spring MVC 的異步請(qǐng)求處理和 Spring WebFlux 的阻塞執(zhí)行支持,現(xiàn)在都將使用虛擬線程。I8Y28資訊網(wǎng)——每日最新資訊28at.com

接下來將分別通過傳統(tǒng)阻塞Servlet技術(shù)、使用虛擬線程及使用反應(yīng)式技術(shù)WebFlux來分別對(duì)比它們的性能。I8Y28資訊網(wǎng)——每日最新資訊28at.com

2. 性能對(duì)比

使用虛擬線程 & 傳統(tǒng)Servlet都使用下面的接口:I8Y28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("/task/default")public class TaskDefaultController {  @GetMapping("")  public Object index() throws Exception {    System.out.printf("before - %s%n", Thread.currentThread()) ;    TimeUnit.MILLISECONDS.sleep(100) ;    System.out.printf("after - %s%n", Thread.currentThread()) ;    return "task - default..." ;  }}

先測試下啟用虛擬線程執(zhí)行情況。I8Y28資訊網(wǎng)——每日最新資訊28at.com

配置:I8Y28資訊網(wǎng)——每日最新資訊28at.com

spring:  threads:    virtual:      enabled: true

控制臺(tái)輸出:I8Y28資訊網(wǎng)——每日最新資訊28at.com

before - VirtualThread[#42,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1after - VirtualThread[#42,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1

使用的是虛擬線程。I8Y28資訊網(wǎng)——每日最新資訊28at.com

2.1 傳統(tǒng)Tomcat線程池方式

配置線程池,如果不配置使用默認(rèn)的最大線程200,整體的吞吐量將在2200作用。I8Y28資訊網(wǎng)——每日最新資訊28at.com

server:  tomcat:    threads:      min-spare: 500      max: 1000

初始啟動(dòng)服務(wù)后,內(nèi)存,CPU占用情況;默認(rèn)啟動(dòng)后線程個(gè)數(shù)與上面配置一致。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

使用jmeter測試,配置如下:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

使用500個(gè)線程,循環(huán)200次,整體做100000次壓測。后續(xù)的測試都會(huì)基于該配置進(jìn)行。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

吞吐量為:4696I8Y28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存,CPU占用情況I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

2.2 使用虛擬線程

首先開啟虛擬線程I8Y28資訊網(wǎng)——每日最新資訊28at.com

spring:  threads:    virtual:      enabled: true

初始啟動(dòng)服務(wù)后,內(nèi)存,CPU占用情況I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

jmeter測試情況如下:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

吞吐量為:4677,與上面的阻塞Servlet基本差不多。但傳統(tǒng)Tomcat線程池方式需要更多的線程才能達(dá)到這一值。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

整個(gè)過程內(nèi)存使用情況,虛擬線程要比傳統(tǒng)Tomcat線程池方式占用的多。I8Y28資訊網(wǎng)——每日最新資訊28at.com

JDK 的虛擬線程調(diào)度器是一個(gè)工作偷取 ForkJoinPool,以先進(jìn)先出(FIFO)模式運(yùn)行。調(diào)度器的并行性是指可用來調(diào)度虛擬線程的平臺(tái)線程數(shù)。默認(rèn)情況下,它等于可用處理器的數(shù)量,但可以通過系統(tǒng)屬性 jdk.virtualThreadScheduler.parallelism 進(jìn)行調(diào)整。ForkJoinPool 與普通池不同,普通池用于并行流的實(shí)現(xiàn),并以后進(jìn)先出模式運(yùn)行。I8Y28資訊網(wǎng)——每日最新資訊28at.com

調(diào)整數(shù)量再進(jìn)行測試,設(shè)置JVM參數(shù)I8Y28資訊網(wǎng)——每日最新資訊28at.com

-Djdk.virtualThreadScheduler.parallelism=100 -Djdk.virtualThreadScheduler.maxPoolSize=100

設(shè)置100個(gè)平臺(tái)線程來調(diào)用虛擬線程。I8Y28資訊網(wǎng)——每日最新資訊28at.com

啟動(dòng)服務(wù)后,線程,內(nèi)存使用情況。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

jmeter測試結(jié)果如下:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

與調(diào)整前沒什么區(qū)別,反而是增加了應(yīng)用的線程數(shù)量。I8Y28資訊網(wǎng)——每日最新資訊28at.com

2.3 反應(yīng)式WebFlux

引入依賴

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-webflux</artifactId></dependency>

基于webflux,我們需要重新編寫接口測試。I8Y28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("/task/reactor")public class ReactorController {  @GetMapping("")  public Object index() throws Exception {    // 與上面2種方式不同,reactor方式則需要使用delayElement方式來模擬耗時(shí)任務(wù)    return Mono.just("task - reactor...").delayElement(Duration.ofMillis(100)) ;  }}

初始啟動(dòng)服務(wù)后,內(nèi)存,CPU占用情況。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

jmeter測試情況如下:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

吞吐量為:4659,與上面的測試結(jié)果基本一致。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存使用情況要比前面幾種方式占用都少。同時(shí)通過jmeter測試結(jié)果也能發(fā)現(xiàn),MAX請(qǐng)求的最大響應(yīng)時(shí)間webflux是最小的,Std.Dev:所有請(qǐng)求響應(yīng)時(shí)間的標(biāo)準(zhǔn)差也是最小的(該值越小,平均值越可靠)。I8Y28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)測試結(jié)果,虛擬線程與webflux誰更勝一籌還不夠清晰,接下來我們結(jié)合數(shù)據(jù)庫操作進(jìn)行測試。I8Y28資訊網(wǎng)——每日最新資訊28at.com

3. 基于數(shù)據(jù)庫測試

數(shù)據(jù)庫數(shù)據(jù)準(zhǔn)備了600w的數(shù)據(jù)。I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

3.1 傳統(tǒng)Tomcat線程池方式

基于JPA進(jìn)行數(shù)據(jù)庫的操作I8Y28資訊網(wǎng)——每日最新資訊28at.com

@Entity@Table(name = "t_user")public class User {  @Id  @GeneratedValue(strategy = GenerationType.IDENTITY)  private Integer uid ;  private String name ;}

Repository接口I8Y28資訊網(wǎng)——每日最新資訊28at.com

public interface UserRepository extends JpaRepository<User, Integer> {}

Controller測試接口I8Y28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("/users")public class UserController {  @Resource  private UserRepository ur ;    @GetMapping("/count")  public User count() {    return ur.findById(5800000).orElse(null) ;  }  }

測試結(jié)果:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

3.2 使用虛擬線程

記得開啟虛擬線程,測試結(jié)果如下:I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

3.3 反應(yīng)式WebFlux

需要引入如下依賴I8Y28資訊網(wǎng)——每日最新資訊28at.com

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-r2dbc</artifactId></dependency><dependency>  <groupId>com.github.jasync-sql</groupId>  <artifactId>jasync-r2dbc-mysql</artifactId>  <version>2.1.24</version></dependency>

配置I8Y28資訊網(wǎng)——每日最新資訊28at.com

spring:  r2dbc:    url: r2dbc:mysql://localhost:3306/batch?serverZnotallow=GMT%2B8&sslMode=DISABLED    username: root    password: xxxooo    pool:      initialSize: 100      maxSize: 100      max-acquire-time: 30s       max-idle-time: 30m

實(shí)體定義,這里的注解與jpa不一樣I8Y28資訊網(wǎng)——每日最新資訊28at.com

@Table("t_user")public class User {    @Id  private Integer uid ;  private String name ;}

Repository定義I8Y28資訊網(wǎng)——每日最新資訊28at.com

public interface UserR2DBCRepository extends ReactiveCrudRepository<User, Integer> {}

Controller接口I8Y28資訊網(wǎng)——每日最新資訊28at.com

@RestController@RequestMapping("/r2dbc")public class UserR2DBCController {  @Resource  private UserR2DBCRepository ur ;    @GetMapping("/users")  public Mono<User> count() {    return ur.findById(5800000)  ;  }  }

測試結(jié)果I8Y28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片I8Y28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)測試結(jié)果來,webflux的整體性能遠(yuǎn)遠(yuǎn)高于虛擬線程及傳統(tǒng)tomcat線程池的方式。I8Y28資訊網(wǎng)——每日最新資訊28at.com

以上是本篇文章全部內(nèi)容,希望對(duì)你有幫助。I8Y28資訊網(wǎng)——每日最新資訊28at.com

完畢!!!I8Y28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-70431-0.htmlSpringBoot3虛擬線程 &amp; 反應(yīng)式(WebFlux) &amp; 傳統(tǒng)Tomcat線程池性能對(duì)比

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C++實(shí)現(xiàn)多功能計(jì)算器

下一篇: 一個(gè)用著方便的超強(qiáng)Python解釋器

標(biāo)簽:
  • 熱門焦點(diǎn)
Top