缘起:

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

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

定位问题:

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接口调试时请求串行特性分析的更多相关文章

  1. Centos 7 上使用nginx为Node.js配置反向代理时错误:(13: Permission denied) while connecting to upstream

    错误来源:Centos 7 上使用nginx为Node.js配置反向代理时产生(13: Permission denied) while connecting to upstream的错误 nginx ...

  2. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  3. 用简单的 Node.js 后台程序浅析 HTTP 请求与响应

    用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...

  4. 使用Redis分布式锁控制请求串行处理

    1.需求背景 在一些写接口的场景下,由于一些网络因素导致用户的表单重复提交,就会在相邻很短的时间内,发出多个数据一样的请求.后台接口的幂等性保证一般都是先检查数据的状态,然后决定是否进行执行写入操作, ...

  5. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  6. Node.js中,获取req请求的原始IP

    Node.js代码 var express = require('express'); var app = express(); var http = require('http'); var ser ...

  7. MVC打包压缩JS&CSS文件调试时过滤了一些文件

    BundleTable.这个确实是比较好用,打包并压缩了CSS,使之加载时减少流量. 但是在调试的时候会疑问为何有很多JS,CSS文件无法打包,其实是因为调试时VS自动过滤了如下文件:   后台跟踪了 ...

  8. node.js系列(实例):原生node.js实现接收前台post请求提交数据

    前台界面: 前台代码: <form class="form-horizontal" method="post" action="http:127 ...

  9. node.js在读取文件时中文乱码问题

    断更很久了........从今天开始会努力的持续更博,积极学习. 言归正传.今天在写node.js的demo时发现一个bug.我在node中读取本地的text文件时,发现英文的内容可以被读取,但是中文 ...

随机推荐

  1. 从头推导与实现 BP 网络

    从头推导与实现 BP 网络 回归模型 目标 学习 \(y = 2x\) 模型 单隐层.单节点的 BP 神经网络 策略 Mean Square Error 均方误差 \[ MSE = \frac{1}{ ...

  2. Oracle 12c 单实例安装

    准备工作 实验环境:Redhat 6.6   Oracle 12c 12.2.0.1 1.官网下载 https://www.oracle.com/technetwork/database/enterp ...

  3. wqweqweqwe

    本文目录 1 会话跟踪技术 2 cookie介绍 Django中操作Cookie Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 回到目录 ...

  4. 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

    访问jsp文件时,出现错误: 解决办法: 1.在Tomcat目录下的lib文件夹中加入jstl包 2. 在maven项目中加入jstl包:

  5. KAFKA跨主机部署网络不通解决思路

    Kafka的部署不仅需要集群可用,同时需要对orderer节点可连,这就是为什么有的时候,kafka集群本身没问题,但是orderer却总是报错. 为了试验kafka剥离方案的可行性,跨阿里云网络和内 ...

  6. SSH无法连接到服务器

    SSH服务器会无法连接,有时候并不是密码的问题,可能由于你上次改了密码(就算改成跟上次一样也是一个效果)导致家目录下的known_hosts(/root/.ssh/known_hosts)不一样了并且 ...

  7. Web浏览器与Web服务器之间的通信过程

     HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:1:建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  8. ubuntu安装QGIS

    参考官网https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu 但是官网写的太繁琐分散,没有按每个OS集中写cli安装完整过 ...

  9. git checkout branch

    git fetch origin feature/banch1:feature/banch1 git checkout feature/banch1 git branch -u origin/feat ...

  10. C语言缓冲区

    定义 缓冲区是内存空间的一部分,用于缓冲输入或输出的数据.根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区. 类型 缓冲区分为三种类型:全缓冲.行缓冲和不带缓冲. 1.全缓冲 在这种情况 ...