Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js http接口调试时请求串行特性分析大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

缘起:

  产品业务上有个类数据库服务的请求时间比较长(类似MysqLSQL查询),为了优化减少并发时的请求数,做了一个并发时共用请求的优化。

  通过单元测试后,想通过手动模拟看下效果,发现优化一直不能生效。

 

定位问题:

1、在mac下,同时开了两个chrome窗口,分别促发访问同一个接口(请求入口打印input,中间设定几秒的延时,出口打印output)。

  async test(ctX) {
    console.log(‘input‘);
    await bluebird.delay(10000);
    console.log(‘output‘);
    ctx.response.body = ‘ok‘;
  }

输出结果如下:

input
output
input
output

结果分析:两次请求无法并发执行,而是串行到一起,当第一个请求返回后,第二个请求才开始进入执行。

猜测:是否是在用的egg.js框架,给做的这种特性?为了方便调试环境的代码测试?可是之前看egg.js的代码也没看到这个功能呀?文档也没说明这个功能呀?

2、同事提出了疑惑“不可能是egg.js的实现,不然其它的框架难道都得实现一套”?

3、同样代码,用production模式执行下(如果可以串行,那么生产环境是不可能这么处理的)。

结果保持不变:

input
output
input
output

同样的代码,换koa框架进行测试。

同样的代码,换node原生http服务进行测试。
结果保持不变:

input
output
input
output

结果分析:终结了测试1中的猜想。只能是node或以下的实现。

4、测试下不同机器的浏览器同时访问。

结果为能并发成功:

input
input
output
output

测试了同一机器的不同类型的浏览器进行测试(用了chrome和safari)。

结果为能并发成功:

input
input
output
output 

结果分析:chrome 两个窗口访问请求并不是独立的。

猜测:chrome两个窗口相同的请求共用了tcp连接。(才想到http1.1的服用tcp请求的时候是按顺序的)。

5、打印出tcp连接对应的请求端的端口。

当在mac下两个chrome窗口的时候,

结果为:

input 54345
output 54345
input 54345
output 54345

当不同浏览器的请求的接口:

结果为:

input 54355
input 54356
output 54355
output 54356

结果分析:在纯chrome环境下,相同http请求共用了tcp连接,产生串行的效果。在区分浏览器的环境下,两个http请求分别使用了各自的tcp连接,能产生并发效果

 

结论:在chrome浏览器,即使你开了两个窗口,但是它们还是不完全独立的,会共用tcp连接。产生请求串行效果。一定情况下方便调试。

  如果要测试并发的http请求。需要开启多个tcp连接。

大佬总结

以上是大佬教程为你收集整理的node.js http接口调试时请求串行特性分析全部内容,希望文章能够帮你解决node.js http接口调试时请求串行特性分析所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。