【问题标题】:express js API server multiple requests block each other?express js API服务器多个请求互相阻塞?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 1970-01-01
      • 2018-02-10
      • 2020-06-27
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多