表达js API服务器的多个请求相互阻塞?

时间:2018-07-30 10:34:07

标签: 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/

当我一次发出一个请求时,我得到大约600ms-900ms的时间(这不是很好,但是基于数据库体系结构(实体-属性-值),没有其他方法可以提高这种速度)。以下是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]

注意: 我已经测试了有无记录器,并且时间没有差异(使用邮递员),所以我知道我使用的计时器不会阻塞事件循环< / em>


问题

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

当发送多个请求时,它们似乎变得“混乱”,第一个请求将等待直到最后一个请求完成后才进行响应。这是记录器针对同时发生的4个请求(从4个浏览器标签中的chrome发送,同时重新加载)发出的示例输出

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的部分答案,并且我的代码似乎没有阻塞事件循环,所以我不确定是否正在发生或如何解决该问题。 / p>

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

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

1 个答案:

答案 0 :(得分:1)

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