提问者:小点点

Quarkus响应式客户端真的是响应式的吗?


我想探测来自QUUKUS的反应式REST客户端的缓慢后端,并对他们建议的示例(https://github.com/quarkusio/quarkus-quickstarts/tree/main/rest-client-reactive-quickstart)进行了一些负载测试,只是进行了一些小的修改。我在build. gradle中具有以下依赖项,并将QUUKUS版本设置为2.11.3.Final:

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
    implementation 'io.quarkus:quarkus-rest-client-reactive'
    implementation 'io.quarkus:quarkus-resteasy-reactive'
    implementation 'io.quarkus:quarkus-arc'
    testImplementation 'io.quarkus:quarkus-junit5'
    testImplementation 'io.rest-assured:rest-assured'
}

我想检查具有两种变体的慢应答后端的行为

  • 创建一个新的Uni并延迟其发射
  • 调用本地运行的go服务器,该服务器只需要等待一秒钟来响应(可以在这里找到:https://gist.github.com/s-macke/c3b1d0029ef61efc7ed2d22a4132cad2)

我的资源和调用后端的客户端如下所示:

@Path("/reactive")
public class ReactiveResource {
    
    @RestClient
    TimeoutTestService service;
    
    @GET
    @Path("delay")
    @Produces(MediaType.TEXT_PLAIN)
    public Uni<String> reactiveThreadTimeout() {
        return Uni.createFrom().item("Hello RESTEasy")
                .onItem().delayIt().by(Duration.of(1, ChronoUnit.SECONDS));
    }
    
    @GET
    @Path("remote")
    @Produces(MediaType.TEXT_PLAIN)
    public Uni<String> reactiveRemoteTimeout() {
        return service.testTimeoutReactive();
    }
    
}
@RegisterRestClient(baseUri = "http://localhost:8500")
@Produces(MediaType.TEXT_PLAIN)
public interface TimeoutTestService {
    
    @GET
    @Path("/reactive")
    Uni<String> testTimeoutReactive();
    
}

通过负载测试,我对第一个变体没有任何问题,即使每秒300个请求,所有请求也能在1秒内得到响应。在第二个变体中,它在20 rps的情况下工作得很好,但是更多的负载响应时间慢慢增加,好像有什么东西阻塞了调用线程。我可以排除go服务器,因为它可以在直接调用它时处理300 rps而没有问题。也许问题是由于在我的本地机器上运行的QUKUS和go服务器,但我仍然期望反应式客户端有更好的结果。当使用超过基本负载的反应式客户端时,还有人观察到类似的问题吗?


共1个答案

匿名用户

您遇到了https://github.com/quarkusio/quarkus/issues/21884.这可能看起来出乎意料,但客户端有一个默认大小为20的连接池。如果您想允许超过20个并发请求,您可以重新配置它:

quarkus.rest-client."com.example.TimeoutTestService".connection-pool-size=100