Netty是最近非常流行的高性能异步通訊框架相对于Java原生的NIO接口,Netty封装后的异步通讯机制要简单很多
但是小K最近发现并不是所有开发人员在使用的过程中都了解其内部实现機制,而是照着葫芦画瓢
网上简单搜索下,在客户端使用Netty建立连接池的文章也是比较少今天小K给大家简单介绍下使用Netty建立连接池的方法。
首先我们来看下Netty官方给出的客户端sample实例:
//创建一个EventLoopGroup可以简单认为是Netty框架下的线程池,默认最大线程数量是处理器数量的2倍
很简单沒错,确实如此那么现在问题来了,如果你现在需要连接100个服务器你会怎么做呢?
下面这样处理怎么样呢我们在外层加了一个for循环
//創建一个EventLoopGroup,可以简单认为是Netty框架下的线程池默认线程数量是处理器数量的2倍
问题很明显,如果每一个channel都对应一个NIOEventLoopGroup那么我们实际上构建叻一个connection:thread = 1:1的模型,随着连接数不断地扩大线程膨胀的问题就会突显出来。
那么如何避免线程膨胀的问题呢很简单,我们只要稍微修改下仩面的代码就可以了
在上面的代码中,我们使用同一个Bootstrap创建了多个连接从而使连接共享了一个NioEventLoopGroup,避免了线程膨胀的问题
问题就这样解决了吗?NO还远远没有结束哦,那么问题又来了
1、如果希望每个连接能够使用不同的Handler怎么办?
2、每个连接如何能够再次复用避免重複创建channel?
为了能够创建异步操作的连接池我们需要实现如下的模型
为了能够方便地建立一个异步操作的连接池,我们会使用到FixedChannelPool(不了解嘚同学麻烦Google一下吧(⌒_⌒))
其伪代码如下(具体的代码实现结构还是留给读者自己思考吧):
通常情况下,我们并不需要使用Netty建立连接池common pool可以满足我们的需求,但是有些业务场景(例如:返回结果时间不确定)需要使用这种异步的连接池在正确的业务场景下选择正确的解决方案才是王道哦。