关于Dubbo Node RPC,TCP长连接复用的疑问
发布于 5 年前 作者 lianxuify 2958 次浏览 来自 问答

因为要实现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;
			  }
		};
回到顶部