【发布时间】:2019-01-06 14:09:36
【问题描述】:
我创建了一个 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/
当我一次触发一个请求时,我会得到大约 600 毫秒到 900 毫秒的时间(这不是很好,但基于数据库架构(实体属性值),没有其他方法可以提高这个速度)。下面是来自winston 的日志,我设置它来监控每个请求所花费的时间。
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]
注意: 我已经测试过使用和不使用记录器,并且时间没有差异(使用邮递员),所以我知道我使用的计时器不会阻塞事件循环
问题
当用户在系统前端加载仪表板时,此请求可能会同时触发多达 1-100 次,因为每个单独的小部件都会加载自己的数据。 (平均每个仪表板大约有 20-30 个小部件)
当发送多个请求时,它们似乎被“批处理”了,第一个请求会等到最后一个请求完成后再响应。这是记录器的示例输出,用于同时发生 4 个请求(从 chrome 在 4 个浏览器选项卡同时重新加载中发送)
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]
我期望看到的是所有请求都以一个请求的速度运行(因为它们都是异步运行的)
我已尝试从堆栈溢出 linked here 运行部分答案,但我的代码似乎没有阻止事件循环,所以我不确定发生了什么或如何解决它。
我也尝试在 pm2 中以集群模式运行代码(通过使用 pm2 start index.js -i max),但所有请求似乎都在同一个实例上运行,而不是相互平衡。
每个请求都有很多代码在运行,我不确定哪些部分可能与此问题相关。如果有我需要添加到这篇文章中的代码示例,请尽我所能告诉我。
【问题讨论】:
标签: node.js performance http express