-2

为什么创建一个新的引导程序看起来如此尴尬?应该有比通常更简单的方法来做到这一点

serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
    Executors.newCachedThreadPool(),
    Executors.newCachedThreadPool()));

它的样子绝对是可怕的。比如,为什么我必须调用 newCachedThreadPool() 两次?

4

1 回答 1

0

在最新版本的 Netty 中,您可以使用默认NioServerSocketChannelFactory构造函数,它使用两个缓存线程池,就像您目前正在做的那样。然后,boostrap 实例化将看起来像这样,它不那么冗长:

ServerBootstrap sb = new ServerBootstrap(new NioServerSocketChannelFactory());

但是,请研究这些线程池的用途。在某些情况下(例如缓慢的 loris 攻击),此设置不会很好地工作,而是会导致 Java 进程耗尽堆空间。出于这个原因,您可能需要查看 Netty 提供的MemoryAwareThreadPoolExecutor类。

缓存线程池本质上是邪恶的,因为它们有一个达到“临界质量”的点。在这种情况下,当线程数非常高时,由于上下文切换的开销而导致性能下降。由于线程数导致性能下降,线程池工作人员完成任务的速度会更慢。由于这些工作人员忙于较长时间,缓存线程池必须继续创建新线程来处理持续的工作负载。随着更多线程的创建,性能继续降低事件更多。问题是自己造成的,您的服务器基本上会爆炸。玩得开心!

于 2012-08-15T22:36:38.757 回答