为什么创建一个新的引导程序看起来如此尴尬?应该有比通常更简单的方法来做到这一点
serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
它的样子绝对是可怕的。比如,为什么我必须调用 newCachedThreadPool() 两次?
为什么创建一个新的引导程序看起来如此尴尬?应该有比通常更简单的方法来做到这一点
serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
它的样子绝对是可怕的。比如,为什么我必须调用 newCachedThreadPool() 两次?
在最新版本的 Netty 中,您可以使用默认NioServerSocketChannelFactory
构造函数,它使用两个缓存线程池,就像您目前正在做的那样。然后,boostrap 实例化将看起来像这样,它不那么冗长:
ServerBootstrap sb = new ServerBootstrap(new NioServerSocketChannelFactory());
但是,请研究这些线程池的用途。在某些情况下(例如缓慢的 loris 攻击),此设置不会很好地工作,而是会导致 Java 进程耗尽堆空间。出于这个原因,您可能需要查看 Netty 提供的MemoryAwareThreadPoolExecutor类。
缓存线程池本质上是邪恶的,因为它们有一个达到“临界质量”的点。在这种情况下,当线程数非常高时,由于上下文切换的开销而导致性能下降。由于线程数导致性能下降,线程池工作人员完成任务的速度会更慢。由于这些工作人员忙于较长时间,缓存线程池必须继续创建新线程来处理持续的工作负载。随着更多线程的创建,性能继续降低事件更多。问题是自己造成的,您的服务器基本上会爆炸。玩得开心!