1. 调用入口
AsyncGenericConnectionPool的sendRequest函数
函数内部完成多项主要任务:
1. 选环(每个连接池对应的request对象有其自有的选环策略)
int serverCount = this.getServerIdCount();
如WebQuery的选环策略如下:
public int getServerId( int serverCount ){
if( serverCount <= 0 ) return -1;
byte[] bt = getDigest();
if( bt==null || bt.length<=0 ){
return -1;
}
int t = (int)bt[0];
if(t<0) t+= 256;
Statistics.getInstance().cacheQuery( t%16 );
int val;
if( bt[0] < 0 ){
val = bt[0]+256;
} else {
val = bt[0];
}
int ret = val % serverCount;
Statistics.getInstance().realCacheQuery( ret );
return ret;
}
2.请求类别
请求类别:
1. 重试请求
2. 影子请求
3. 普通请求
重试请求:
连接池会将该请求会发送给一个已经标记为不可用的searchhub服务器,目的在于:
1.验证该服务器运行状态是否恢复,如果成功收到该服务器响应请求,则重新标记该服务器为可用服务器
2.如果重试请求收到的结果早于普通结果收到的结果返回,则使用重试请求得到的结果
影子请求:
影子请求是对应与某个普通请求的,是某个普通请求的“影子”,该请求的出现是由于普通请求在一定的短时间内没有收到响应,由连接池构建一个新的请求(影子)
发送给别的服务器,两个请求谁先收到响应则使用谁的结果
普通请求:
对应用户访问生成的请求,由异步连接池进行发送
用户选环成功后,选取该环对应的服务器,将request请求发送给对应的服务器(searchhub)