javascript
原始性能数字– Spring Boot 2 Webflux与Spring Boot 1
我對性能測試的設置如下:
示例應用程序公開了一個端點(/ passthrough / message),該端點又調用下游服務。 到端點的請求消息如下所示:
{"id": "1","payload": "sample payload","delay": 3000 }下游服務將基于消息中的“延遲”屬性(以毫秒為單位)進行延遲。
Spring Boot 1應用程序
我已經將Spring Boot 1.5.8.RELEASE用于該應用程序的Boot 1版本。 端點是一個簡單的Spring MVC控制器,它依次使用Spring的RestTemplate進行下游調用。 一切都是同步且阻塞的,我已使用默認的嵌入式Tomcat容器作為運行時。 這是下游調用的原始代碼:
public MessageAck handlePassthrough(Message message) {ResponseEntity<MessageAck> responseEntity = this.restTemplate.postForEntity(targetHost + "/messages", message, MessageAck.class);return responseEntity.getBody(); }Spring Boot 2應用程序
該應用程序的Spring Boot 2版本公開了一個基于Spring Webflux的終結點,并使用WebClient ,這是RestTemplate的新的非阻塞,反應性替代方法,可以進行下游調用–我也使用Kotlin進行了實現,這與性能無關。 運行時服務器為Netty :
import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.web.reactive.function.BodyInserters.fromObject import org.springframework.web.reactive.function.client.ClientResponse import org.springframework.web.reactive.function.client.WebClient import org.springframework.web.reactive.function.client.bodyToMono import org.springframework.web.reactive.function.server.ServerRequest import org.springframework.web.reactive.function.server.ServerResponse import org.springframework.web.reactive.function.server.bodyToMono import reactor.core.publisher.Monoclass PassThroughHandler(private val webClient: WebClient) {fun handle(serverRequest: ServerRequest): Mono<ServerResponse> {val messageMono = serverRequest.bodyToMono<Message>()return messageMono.flatMap { message ->passThrough(message).flatMap { messageAck ->ServerResponse.ok().body(fromObject(messageAck))}}}fun passThrough(message: Message): Mono<MessageAck> {return webClient.post().uri("/messages").header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).body(fromObject<Message>(message)).exchange().flatMap { response: ClientResponse ->response.bodyToMono<MessageAck>()}} }性能測試的詳細信息
測試很簡單,對于不同組的并發用戶(300、1000、1500、3000、5000),我發送了一個延遲屬性設置為300 ms的消息,每個用戶重復該場景30次,延遲為1-2請求之間的秒數。 我正在使用出色的加特林工具來生成此負載。
結果
這些是加特林捕獲的結果:
300個并發用戶:
1000個并發用戶:
1500個并發用戶:
3000個并發用戶:
5000個并發用戶:
可以預期的是,當并發用戶數保持較低水平(例如,少于1000個)時,Spring Boot 1和Spring Boot 2都能很好地處理負載,并且95%的響應時間仍比預期的300 ms延遲高出幾毫秒。
在更高的并發級別上,Spring Boot 2中的異步非阻塞IO和響應式支持開始顯示其顏色-即使負載非常大的5000個用戶,第95個百分位時間仍保持在312ms左右! 在這些并發級別上,Spring Boot 1記錄了很多故障和高響應時間。
我在github回購中提供了所有示例和加載腳本– https://github.com/bijukunjummen/boot2-load-demo。
翻譯自: https://www.javacodegeeks.com/2017/10/raw-performance-numbers-spring-boot-2-webflux-vs-spring-boot-1.html
總結
以上是生活随笔為你收集整理的原始性能数字– Spring Boot 2 Webflux与Spring Boot 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙音箱选择时要注意哪几个要点
- 下一篇: 蓑衣怎么读 蓑衣的读音