我有一个 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-connections和server.tomcat.max-threads属性。