让我们假设我们的Netty服务器(4.1.32)响应http调用。我们进一步假设它必须执行某些阻止操作才能应答传入的请求,例如,它必须执行传出调用(在此处使用其他库)以加载外部数据。
Number of threads for NioEventLoopGroup with persistent connections丁字裤
如果我的messageReceived方法阻塞某件事或需要很长时间才能完成?
@Maksym回应的
您应该避免在处理程序中使用线程阻塞操作。
很明显只有有限数量的工作线程。因此,有效地阻止所有可用的工作线程意味着Netty将对任何其他请求进行排队,直到工作线程可用为止。另一方面,按照建议将阻塞操作移到我自己的线程上,会对线程切换产生性能影响,而可用硬件会阻塞的是我自己的线程池。恕我直言,使用我自己的线程池只会增加另一层复杂性,但不会提高性能。相反,我宁愿增加工作线程的最大数量,并让Netty负责排队请求。
这里的建议做法是什么?
答案 0 :(得分:2)
您应该使用自己的线程池,句点。 Netty工作者线程在许多连接中共享,如果您阻塞处理一个请求,它将损害其他请求。该设计假定您的代码快速返回,如果需要阻止,则必须为此使用单独的线程。如果您需要执行非常昂贵的计算,在另一个线程中执行并返回,则同样适用。
如果您已完成任何Swing编程,则可以将其与GUI线程进行比较。如果您阻止GUI线程,则用户界面将挂起并变得无响应。不适合用户界面,也不适合高性能网络应用程序!
编辑:非常清楚,对于经典IO,通常将一个线程分配给一个请求,并且如果该请求不是世界末日而阻塞,则如果线程池足够大,则其他线程可以处理其他请求。使用NIO时,您不会为请求获得线程,而是由处理许多事件的IO处理事件的线程调用该线程,并且应该尽快执行该操作,以便该线程可以移至另一个线程。要求。阻塞确实对服务器不利。