【发布时间】:2011-12-15 07:23:44
【问题描述】:
我打算在即将到来的项目中使用 Netty。该项目将充当客户端和服务器。特别是它会建立和维护与各种服务器的许多连接,同时为自己的客户端提供服务。
现在,NioServerSocketChannelFactory 的文档很好地指定了服务器端的线程模型 - 每个绑定的监听端口在整个过程中都需要一个专用的 boss 线程,而连接的客户端则需要在 worker 线程上以非阻塞方式处理。具体来说,一个工作线程将能够处理多个连接的客户端。
但是,NioClientSocketChannelFactory 的文档不太具体。这似乎也利用了 boss 和 worker 线程。但是,文档指出:
一个 NioClientSocketChannelFactory 有一个老板线程。它根据请求进行连接尝试。一旦连接尝试成功,boss 线程将连接的 Channel 传递给 NioClientSocketChannelFactory 管理的工作线程之一。
工作线程似乎也以与服务器案例相同的方式运行。
我的问题是,这是否意味着从我的程序到外部服务器的每个连接都会有一个专用的 boss 线程?如果我建立数百或数千个这样的连接,这将如何扩展?
作为旁注。将单个 Executor(缓存线程池)同时用作 ChannelFactory 的 bossExecutor 和 workerExecutor 是否有任何不利的副作用?在不同的客户端和/或服务器 ChannelFactory 实例之间重用呢? This is somewhat discussed here,但我发现这些答案不够具体。谁能详细说明一下?
【问题讨论】:
-
由于 NioClientSocketChannelFactory 和 OioClientSocketChannelFactory 可以很容易地相互替换,您现在可以选择其中任何一个。在您准备好进行一些性能测试后,您可以切换到另一个,看看它是否会提供更好或更差的性能。对于非常简单的情况,我在这里完成了此操作:gist.github.com/1120694 注意:它们是可替换的,但在不正确使用的情况下会有所不同 - 我在上面提到的要点中对此有评论。
-
@IvanSopov 我从来没有真正考虑过使用 ChannelFactories 的 Oio 版本,因为我知道它们每个连接都使用一个专用线程,我对线程数感到不舒服与连接数成正比。我担心 NioClientSocketChannelFactory 也会这样做(针对客户端,而不是针对服务器),但现在已经被证明是错误的。
标签: java asynchronous network-programming nio netty