【发布时间】:2019-07-16 01:05:05
【问题描述】:
假设我们的 Netty 服务器 (4.1.32) 响应 HTTP 调用。让我们进一步假设它必须执行某些阻塞操作才能响应传入请求,例如,它必须执行传出调用(此处使用不同的库)以加载外部数据。
Number of threads for NioEventLoopGroup with persistent connections 讨论
如果我的 messageReceived 方法阻塞或需要很长时间才能完成,会发生什么情况?
@Maksym 的回应
您应该避免在处理程序中使用线程阻塞操作。
很明显,只有有限数量的工作线程。因此,有效地阻塞所有可用的工作线程意味着 Netty 将排队任何进一步的请求,直到工作线程变得可用。
另一方面,按照建议将阻塞操作移动到我自己的线程上,将对线程切换产生性能影响,而可用硬件又会阻塞我自己的线程池。恕我直言,使用我自己的线程池只会增加另一层复杂性,但不会提高性能。相反,我宁愿增加工作线程的最大数量,让 Netty 完成对请求进行排队的工作。
这里建议的做法是什么?
【问题讨论】:
-
理想情况下,您的应用程序中不应有任何阻塞代码。如果您想同时处理许多操作,从长远来看,庞大的线程池会给您带来很多性能问题,并且当您遇到一些理论限制时可能会发生灾难性故障。
-
@JohnnyV 有时会在需要读取数据库的应用程序中出现阻塞操作。您可以异步执行操作,但 IO 有时会阻塞
标签: java multithreading netty