关于Dubbo Node RPC,TCP长连接复用的疑问
因为要实现dubbo node rpc 通信有个比较重要疑问
问题
对于一个tcp连接到后端(ip:port)的服务,该通道同时提交多个请求1,请求2,请求3,client.on(‘data’, cb), 陆陆续续返回rpc请求数据chunk1, chunk2, 他们的一定是按照请求1,请求2,请求3的顺序返回么?
描述
因为现在我看dubbo2.js 实现是并发提交请求,依赖后端chunk返回数据顺序是与请求一致的,来做到解析出每个请求返回数据的,来实现一个tcp高效使用的。 而我理解当一个tcp 被一个请求1占用,请求1数据还没返回就不能发送请求2,请求1数据全部返回,tcp才释放,放回缓存池中,否则接受的数据块会是混乱的在返回存储的数据队列中,无法根据dubbo header协议,截取和decode出一个个请求的返回值,所以我用generic-pool实现是这样的,用了10个tcp池,速度也没赶上dubbo2.js一个tcp,故看了dubbo2.js源码,有了这样的疑问, 还请各位大佬传道解惑
代码
// dubbo2.js
// tcp 连接成功后,之前推入请求队列中的请求,一并发出
for (let ctx of this._queue.requestQueue.values()) {
if (ctx.isNotScheduled) {
const agentHostList = this._zkClient.getAgentAddrList(ctx);
log('agentHostList-> %O', agentHostList);
//当前的socket是否可以处理当前的请求
if (agentHostList.indexOf(agentHost) != -1) {
this._handleDubboInvoke(ctx.requestId);
}
}
}
// 请求过来,推入请求队列,判断tcp状态,直接发起请求
this._handleQueueRequest = requestId => {
//record current status
log(`handle requestId ${requestId}, current status: ${this._status}`);
switch (this._status) {
case "ready" /* READY */:
//发起dubbo的调用
this._handleDubboInvoke(requestId);
break;
}
};