如何设计每秒可以处理 1k 请求的 Spring 启动应用程序



我有一个 rest 控制器,它接受 post 请求并返回操作是否成功的状态。它适用于每秒 100 个请求,因为我有多个操作在它下面发送响应。

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

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

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

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

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

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

这取决于

您使用的 servlet 服务器。在 application.properties 文件中,可以使用 server.* 属性来设置所需的参数。

在此链接中,您可以在"嵌入式服务器配置"部分下找到这些属性。如果您使用的是默认的 tomcat 嵌入式服务器,请查看 server.tomcat.* 属性。特别是server.tomcat.accept-count,server.tomcat.max-connectionsserver.tomcat.max-threads属性。

最新更新