首页 > 解决方案 > 如何设计一个可以每秒处理 1k 个请求的 Spring Boot 应用程序

问题描述

我有一个休息控制器,它接受发布请求并返回操作是否成功的状态。它适用于每秒 100 个请求,因为我在其底层有多个操作,最终发送响应。

可能有数百个用户试图将请求发送到控制器,因此这一切都使用可完成的未来和 http Async 调用程序完成。当每秒有 1000 个请求然后控制器线程耗尽时,就会出现问题,因为已经有多个线程处理多个请求并且所有线程都在等待未来完成然后发送响应。

如何让我的休息控制器能够每秒处理 1000 个请求而不会中断。

标签: springhttpclientsoftware-designcompletable-future

解决方案


已经有多个线程处理多个请求,并且都在等待将来完成,然后发送响应。

实际上,您可以通过让控制器返回一个CompletableFuture. 只需将服务返回的调用链接起来,CompletableFuture即可将它们转换为适当的响应,而不是使用get()or join()

@RequestMapping
public CompletableFuture<ResponseEntity<…&gt;> processRequest() {
    return myService.getStatusFuture()
                    .thenApply(status -> convertToResponseEntity(status));
}

当然,要使其正常工作,您应该拥有真正的异步服务。如果您正在使用@Async或提交任务CompletableFuture.supplyAsync(),这只会将问题从 HTTP 线程池转移到另一个线程池。


推荐阅读