gpt4 book ai didi

kotlin - 高负载测试spring webflux Webclient的问题

转载 作者:行者123 更新时间:2023-12-02 13:06:50 26 4
gpt4 key购买 nike

我正在尝试从 C# 和 NetCore 学习 Spring Webflux,我们有一个非常相似的问题,例如 this post ,其中第三方服务提供商有一些响应时间问题。
但是用 spring-webclient 测试会使响应时间加倍,我不知道我是否遗漏了什么
我试图创建一个类似的例子:

  • 一台运行 3 台服务器的计算机
  • 仅模拟一些随机延迟时间的演示服务器(端口 8080)
  • C# 中的测试服务器使用异步调用我的“等待”服务器(端口 5000)
  • 使用 spring 和 webclient 测试服务器以调用我的“等待”服务器(端口 8081)

  • 其他运行 JMeter 的计算机,有 1000 个客户端,每个 10 轮

  • 一些代码
    等待服务器
    只是一个简单的路线
    @Configuration
    class TestRouter(private val middlemanDemo: MiddlemanDemo) {

    @Bean
    fun route() = router {
    GET("/testWait", middlemanDemo::middleTestAndGetWait)
    }
    }
    处理程序有一个带有种子的随机生成器,因此每个测试都可以生成相同的延迟序列
    @Service
    class TestWaiter {

    companion object RandomManager {

    private lateinit var random: Random

    init {
    resetTimer()
    }

    @Synchronized
    fun next(): Long {
    val random = random.nextLong(0, 10)
    return random * 2
    }

    fun resetTimer() {
    random = Random(12345)
    }
    }

    private val logger = LoggerFactory.getLogger(javaClass)

    fun testAndGetWait(request: ServerRequest): Mono<ServerResponse> {
    val wait = next()
    logger.debug("Wait is: {}", wait)
    return ServerResponse
    .ok()
    .json()
    .bodyValue(wait)
    .delayElement(Duration.ofSeconds(wait))
    }

    fun reset(request: ServerRequest): Mono<ServerResponse> {
    logger.info("Random reset")
    resetTimer()
    return ServerResponse
    .ok()
    .build()
    }
    }
    使用 JMeter 对服务器进行负载测试,我可以看到大约 9-10 秒的稳定响应时间和 100/秒的最大吞吐量:
    Demo server JMeter response time
    C# 异步演示服务器
    尝试使用 C# 的中间人,此服务器只调用主演示服务器:
    Controller
    [HttpGet]
    public async Task<string> Get()
    {
    return await _waiterClient.GetWait();
    }
    以及带有 httpClient 的服务
        private readonly HttpClient _client;

    public WaiterClient(HttpClient client)
    {
    _client = client;
    client.BaseAddress = new Uri("http://192.168.0.121:8080");
    }

    public async Task<string> GetWait()
    {
    var response = await _client.GetAsync("/testWait");
    var waitTime = await response.Content.ReadAsStringAsync();
    return waitTime;
    }
    }
    测试这个服务给出了相同的响应时间,开销的吞吐量略低,但这是可以理解的
    enter image description here
    spring-webclient 实现
    这个客户端也很简单,只有一个路由
    @Configuration
    class TestRouter(private val middlemanDemo: MiddlemanDemo) {

    @Bean
    fun route() = router {
    GET("/testWait", middlemanDemo::middleTestAndGetWait)
    }
    }
    处理程序只是使用 webclient 调用服务
    @Service
    class MiddlemanDemo {

    private val client = WebClient.create("http://127.0.0.1:8080")

    fun middleTestAndGetWait(request: ServerRequest): Mono<ServerResponse> {
    return client
    .get()
    .uri("/testWait")
    .retrieve()
    .bodyToMono(Int::class.java)
    .flatMap(::processResponse)
    }

    fun processResponse(delay: Int): Mono<ServerResponse> {
    return ServerResponse
    .ok()
    .bodyValue(delay)
    }
    }
    但是,运行测试,吞吐量只能达到 50/秒
    enter image description here
    响应时间加倍,就像我再等待一次,直到负载再次下降
    enter image description here

    最佳答案

    我认为这可能是由池获取时间引起的。
    我假设您的服务器获得超过 1k TPS 并且每个请求看起来需要大约 9 秒。但是默认的HTTP客户端连接池是500。请引用Projector Reactor - Connection Pool .
    请查看日志有PoolAcquireTimeoutException或者您的服务器是否需要一些时间来等待池获取。

    关于kotlin - 高负载测试spring webflux Webclient的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63875070/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com