我可以创建一个Netty NioWorkerPool实例并在多个ServerBootstrap和ClientBootstrap实例之间共享吗?我的应用程序有很多空闲线程,目前,每个Bootstrap都在创建自己的NioWorkerPool,用于我机器上2 *的核心数。
如果我分享这个游泳池,会有什么后果?是否每个人都有机会最终运行,或者服务器或客户端连接是否会尝试占用一切?
即使有一台NioWorkerPool用于服务器,一台用于客户端也会比我拥有的更好。
据我所知,这不是一个重复的问题。我见过其他人谈论共享Executor,我已经做过了,我更感兴趣的是分享实际的NioWorkerPool实例。我有一个我的进程的线程转储,我有大约3000个线程,其中大部分是等待Netty NIO事件。
答案 0 :(得分:4)
是的,你可以。这是一个例子:
ExecutorService executor = Executors.newCachedThreadPool();
NioClientBossPool clientBossPool = new NioClientBossPool(executor, clientBossCount);
NioServerBossPool serverBossPool = new NioServerBossPool(executor, serverBossCount);
NioWorkerPool workerPool = new NioWorkerPool(executor, workerCount);
ChannelFactory cscf = new NioClientSocketChannelFactory(clientBossPool, workerPool);
ChannelFactory sscf = new NioServerSocketChannelFactory(serverBossPool, workerPool);
...
ClientBootstrap cb = new ClientBootstrap(cscf);
ServerBootstrap sb = new ServerBootstrap(sscf);
请注意,您不应为您创建的每个引导程序实例创建新的ChannelFactory
。你应该重复使用工厂。
在不同连接之间共享工作池意味着服务器套接字接受的客户端套接字和套接字可以由属于工作池的同一I / O线程处理。假设这些通道的处理程序在I / O线程调用它们时不会花费太多时间,这通常是一个好主意。
但是,如果特定类型频道的处理人员比其他频道的处理人员花费的时间多得多,那么您可能会看到来自未及时轮到他们的频道的延迟响应。可以通过确保所有处理程序不会阻塞并尽快完成其工作并快速返回来解决此问题。