node.js http接口调试时请求串行特性分析
缘起:
产品业务上有个类数据库服务的请求时间比较长(类似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接口调试时请求串行特性分析的更多相关文章
- 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 ...
- 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程
一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...
- 用简单的 Node.js 后台程序浅析 HTTP 请求与响应
用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...
- 使用Redis分布式锁控制请求串行处理
1.需求背景 在一些写接口的场景下,由于一些网络因素导致用户的表单重复提交,就会在相邻很短的时间内,发出多个数据一样的请求.后台接口的幂等性保证一般都是先检查数据的状态,然后决定是否进行执行写入操作, ...
- 利用Node.js的Net模块实现一个命令行多人聊天室
1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...
- Node.js中,获取req请求的原始IP
Node.js代码 var express = require('express'); var app = express(); var http = require('http'); var ser ...
- MVC打包压缩JS&CSS文件调试时过滤了一些文件
BundleTable.这个确实是比较好用,打包并压缩了CSS,使之加载时减少流量. 但是在调试的时候会疑问为何有很多JS,CSS文件无法打包,其实是因为调试时VS自动过滤了如下文件: 后台跟踪了 ...
- node.js系列(实例):原生node.js实现接收前台post请求提交数据
前台界面: 前台代码: <form class="form-horizontal" method="post" action="http:127 ...
- node.js在读取文件时中文乱码问题
断更很久了........从今天开始会努力的持续更博,积极学习. 言归正传.今天在写node.js的demo时发现一个bug.我在node中读取本地的text文件时,发现英文的内容可以被读取,但是中文 ...
随机推荐
- 常用sql语句总结(一)(查询)
常用sql语句总结(一)(查询) 数据操作语句:DML 数据定义语句:DDL 数据控制语句:DCL (执行顺序------序号) 一.基本查询: 1. SELECT * ----- 2 FROM 数据 ...
- 浏览器解析JavaScript的原理
JavaScript的特点一般都知道的就是解释执行,逐行执行,就是从上到下依次执行. JavaScript的执行之前,其实还是有一些操作的,只是没有表现出来 JavaScript的执行过程: 1.语法 ...
- CF 528D. Fuzzy Search NTT
CF 528D. Fuzzy Search NTT 题目大意 给出文本串S和模式串T和k,S,T为DNA序列(只含ATGC).对于S中的每个位置\(i\),只要中[i-k,i+k]有一个位置匹配了字符 ...
- 【做题】ECFinal2018 J - Philosophical … Balance——dp
原文链接 https://www.cnblogs.com/cly-none/p/ECFINAL2018J.html 题意:给出一个长度为\(n\)的字符串\(s\),要求给\(s\)的每个后缀\(s[ ...
- maven 安装本地jar
mvn install:install-file -Dfile=D:/open-api-sdk-2.0.jar -DgroupId=com.jd.open -DartifactId=jd-api-sd ...
- 论文笔记:DARTS: Differentiable Architecture Search
DARTS: Differentiable Architecture Search 2019-03-19 10:04:26accepted by ICLR 2019 Paper:https://arx ...
- Lintcode177-Convert Sorted Array to Binary Search Tree With Minimal Height-Easy
177. Convert Sorted Array to Binary Search Tree With Minimal Height Given a sorted (increasing order ...
- 11_vim
vim编辑器 文本编辑器,字处理器linux重要哲学思想之一:使用纯文本格式来保存软件的配置信息,大多数情况下都是如此,而且一切皆文件此前学过nano,sed..nano入门简单,但功能简陋 vi:V ...
- 解决一次git问题
由于特殊原因,工作中不能使用sourcetree,今天遇到了一个问题记录一下解决办法,后续还是得好好去廖雪峰大神那里学习一下git的命令行操作呀 You have not concluded your ...
- Jenkins之定时构建
参考文章:https://blog.csdn.net/ZZY1078689276/article/details/77520441 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三 ...