我需要编写一个Web应用程序,该应用程序会接收很多HTTP请求,并且需要很长时间(30到2分钟)来处理每个请求(依次发出其他网络请求),然后返回响应。
因为会有很多请求进入并且这些连接保持打开状态,所以我考虑采用事件驱动的路线,这使我认为Netty是合适的。
如果每个请求都需要很长时间才能处理,这是否会阻止netty的处理?还是我可以接收请求,然后在返回结果到请求的连接之前异步处理它?</ p>
答案 0 :(得分:2)
只要您不阻止事件循环,您就可以处理大量并发请求(取决于可用内存和所用上下文的大小)保留每个请求)。
您需要做的是确保以非阻塞方式发出出站网络请求。通常看起来像这样(在您的Netty入站处理程序中):
CompletableFuture<YourResultType> future = remoteTarget.getStuff();
future.thenApply(ctx::write);
如果要在处理程序之外进行操作,则需要保留对上下文/通道的引用。
请注意,这是一个简化的答案。如果您要发出多个出站请求并具有一些业务逻辑,则需要使用期货的延续性或所使用的任何非阻塞模型来正确地缝合代码。