Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js express js API服务器多个请求是否相互阻止?_Node.js_Performance_Http_Express - Fatal编程技术网

Node.js express js API服务器多个请求是否相互阻止?

Node.js express js API服务器多个请求是否相互阻止?,node.js,performance,http,express,Node.js,Performance,Http,Express,我已经创建了一个API服务器,其中一个端点从MySQL数据库检索、排序和计算数据 端点如下所示: http://localhost:3003/widgetData/$userId/$widgetId/$startDate/$endDate/ $widgetId包含有关要检索的数据的信息。因此,实际使用端点的示例如下: http://localhost:3003/widgetData/94/155/2018-07-01 00:00:00/2018-07-03 00:00:00/ 当我一次发出一

我已经创建了一个API服务器,其中一个端点从MySQL数据库检索、排序和计算数据

端点如下所示:

http://localhost:3003/widgetData/$userId/$widgetId/$startDate/$endDate/
$widgetId包含有关要检索的数据的信息。因此,实际使用端点的示例如下:

http://localhost:3003/widgetData/94/155/2018-07-01 00:00:00/2018-07-03 00:00:00/
当我一次发出一个请求时,我得到的时间约为600ms-900ms(这不是很好,但基于数据库体系结构(实体属性值),没有其他方法可以提高速度)。下面是一个日志,我从中设置了监控每个请求花费的时间

INFO: Data sent to user: 91 in 951.46ms [widgetId:92 - widgetType:barChart - countParams:1- timeSelected:2 Days - start:2018-07-01 00:00:00 end:2018-07-03 00:00:00]
注意:我在使用和不使用记录器的情况下进行了测试,时间没有差异(使用postman),因此我知道我使用的计时器不会阻止事件循环


问题 当用户在系统前端加载一个仪表板时,当每个小部件加载自己的数据时,该请求最多可并发触发1-100次。(每个仪表板平均约有20-30个小部件)

当发送多个请求时,它们似乎得到了“批处理”,第一个请求在响应前等待最后一个请求完成。以下是记录器同时发生4个请求的示例输出(在4个浏览器选项卡中从chrome发送,同时重新加载)

我希望看到的是所有请求都以一个请求的速度运行(因为它们都是异步运行的)

我试着从堆栈溢出中运行部分答案,我的代码似乎没有阻止事件循环,因此我不确定发生了什么或如何解决它

我还尝试在集群模式下运行pm2中的代码(通过使用
pm2 start index.js-I max
),但所有请求似乎都在同一个实例上运行,而不是在彼此之间进行平衡


每个请求都有很多代码在运行,我不确定哪些部分可能与此问题相关。如果有代码示例需要添加到本文中,请尽我所能告诉我。

我认为MySQL数据库是您系统的瓶颈。尝试测量一个请求和并行请求的sql查询执行时间。您应该看到查询时间的急剧增加。如果是这样,您需要避免来自仪表板页面的突发请求。作为一个选项,您只能在小部件可见时初始化它们。另一个选项是手动将所有小部件查询划分为块(即,一个块中有10个请求),然后按顺序运行它们(当来自先前块的所有请求完成时)。但当您有许多用户同时打开仪表板时,这些解决方案将不起作用。因此,您必须优化对数据库的慢速sql查询

INFO: Data sent to user: 91 in 3825.77ms [widgetId:156 - widgetType:barChart - countParams:2- timeSelected:2 Days - start:2018-07-01 00:00:00 end:2018-07-03 00:00:00]
INFO: Data sent to user: 91 in 3827.49ms [widgetId:157 - widgetType:barChart - countParams:1- timeSelected:2 Days - start:2018-07-01 00:00:00 end:2018-07-03 00:00:00]
INFO: Data sent to user: 91 in 3836.12ms [widgetId:92 - widgetType:barChart - countParams:1- timeSelected:2 Days - start:2018-07-01 00:00:00 end:2018-07-03 00:00:00]
INFO: Data sent to user: 91 in 3841.79ms [widgetId:155 - widgetType:barChart - countParams:3- timeSelected:2 Days - start:2018-07-01 00:00:00 end:2018-07-03 00:00:00]