我想探测来自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'
}
我想检查具有两种变体的慢应答后端的行为
我的资源和调用后端的客户端如下所示:
@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服务器,但我仍然期望反应式客户端有更好的结果。当使用超过基本负载的反应式客户端时,还有人观察到类似的问题吗?
您遇到了https://github.com/quarkusio/quarkus/issues/21884.这可能看起来出乎意料,但客户端有一个默认大小为20的连接池。如果您想允许超过20个并发请求,您可以重新配置它:
quarkus.rest-client."com.example.TimeoutTestService".connection-pool-size=100