使用netty作为http的客户端,pool又该如何进行设计。本文将会进行详细的描述。
1 复用类型的选型
1.1 channel 复用
多个请求可以共用一个channel
模型如下:
特点:
1:callback队列为回调队列。 不同的callback通过一个全局的id进行标识。发送的时候会把该id发到服务端,服务端在回复的时候必须把该id再返回到客户端。
2:获取连接只需要随机获取一个channel即可,将callback添加到队列里面。
3: 获取连接时消除了锁的竞争,性能高效。
4:结构简单。
实例:
osp(唯品会的SOA框架) client pool实现(thrift协议); spray的akka client pool。
约束:
需要服务端配合支持channel复用。需要有一个全局唯一的id用于识别请求。 通常id先发给服务端,服务端还要把id会给客户端。
1.2 channel 独享
每个请求独立使用一个channel。
模型如下:
特点:
1:同一个channel同时只给一个request使用。
2:连接池的设计较为复杂。
实例:
1:数据库连接池[druid,c3p0,dbcp,hikaricp,caelus(唯品会内部连接池)]
2:netty的http pool ; apache的httpclient pool, httpasyncclient pool ; nginx的pool。
1.3 选择
由于http1.1协议原生不支持channel复用(http2是支持的),如果需要支持,则需要在header里面加入一个唯一id,所有的应用服务器均需要进行改动。为了和nginx的连接池保持一致,确定使用channel的独享方式。
2 组件选型
组件
|
优点
|
缺点
|
---|---|---|
common-pool | 功能完整 | 不支持异步连接 |
rxnetty pool | 功能完整,支持netty | 使用的为rxjava机制 |
netty pool | netty原生实现 |