ExpressJS Middleware bodyParser 性能很差

Sha*_*ark 7 performance node.js express newrelic body-parser

前几天我们在Rest API中添加了NewRelic,APM,它是用NodeJS编写的,使用EXPRESS JS作为开发框架。

由于 JSON 解析器中间件,现在我们看到很多用户体验到响应时间很短的情况。

这是 NewRelic 中报告的请求之一: 在此处输入图片说明

钻取报告: 在此处输入图片说明

如您所见,大部分时间都被中间件 JSON 解析器消耗。

我们在想问题可能来自大型 JSON 有效负载,有时是从 API 发出的。但是对于这个响应,如上所示,API 返回了 contentLength=598 的数据,这不应该是太大的 JSON。

在此处输入图片说明

我们还使用了在向下钻取的请求执行屏幕截图中可见的压缩中间件。这应该减少来回发送给客户端的 IO 的大小。

此时我们对初始化时传递给中间件的参数限制有疑问。{limit:50kb} 但是在本地测试时它没有任何区别。

在此处输入图片说明

我们在考虑用 protobuf 切换,还考虑了异步解析 JSON 负载的方式。因为中间件使用的 JSON.parse 是同步进程,停止非阻塞 IO。

但是在开始这些更改和实验之前,请如果有人遇到同样的问题,请提出任何可能的解决方案。

基准测试:

对于本地/阶段环境的基准测试,我们使用 JMeter 并生成负载来检查何时可能发生此类超时,但在使用 JMeter 进行测试时我们无法捕捉到这一点。

谢谢你。

小智 0

Express 附带了一个嵌入式 bodyparser,如果你愿意的话你可以尝试一下。由于它是集成的,因此它应该表现得更好。

const express = require('express');
const app = express();

app.use(express.urlencoded()); // support for GET

// No limited usage,
app.use(express.json());       // support for POST
// If you want add request limit,
app.use(express.json({ limit: "1mb" }));
Run Code Online (Sandbox Code Playgroud)

  • 对于express 4.16.x,这是相同的bodyParser。他们只是把它捆绑起来。问题仍然相同。 (2认同)