Java webapp 中请求的异步处理

Async processing of requests in Java webapp

我需要编写一个 web 应用程序,它接收大量 HTTP 请求并且在返回响应之前需要很长时间(30 秒到 2 分钟)来处理每个请求(依次发出其他网络请求)。

因为会有很多请求进入并且这些连接保持打开状态,所以我正在考虑走事件驱动路线,这让我认为 Netty 是合适的。

如果每个请求都需要很长时间来处理,那会不会阻塞netty的处理?或者我可以接收一个请求,然后在将结果返回到请求的连接之前异步处理它吗?

只要您不阻塞事件循环,您将能够处理大量并发请求(取决于可用内存和您为每个请求持有的上下文)。

您需要做的是确保以非阻塞方式发出出站网络请求。这通常看起来像这样(在您的 Netty 入站处理程序中):

CompletableFuture<YourResultType> future = remoteTarget.getStuff();
future.thenApply(ctx::write);

当然,如果您在处理程序之外执行此操作,则需要保留对上下文/通道的引用。

请注意,这是一个简化的答案。如果您正在发出多个出站请求并且有一些业务逻辑,则需要使用 futures 上的延续或您正在使用的任何非阻塞模型来正确拼接您的代码。