node.js - Express:continuation-local-storage 可以处理什么负载?

标签 node.js typescript express node-local-storage continuation-local-storag

我想为我的 express 应用程序启用类似线程的存储,它每分钟处理大约 100 到 300 个 API 调用。我玩过 continuation-local-storage(和 cls-hooked,因为我在 Node 8.9.0 上)但是 CPU 峰值非常高(500 倍正常和不水平)并且使服务器崩溃。端点主要执行 CPU 轻型同步计算(例如调用 API、执行查找,很少执行 I/O 密集型任务)

有人有使用 Express 大规模运行 csl 的经验吗?

最佳答案

最近我在玩cls-rtracer ,我的 Express 和 Koa 小图书馆。这个库只是构建在 cls-hooked 之上的轻量级中间件的集合。 .所以基本上我是在测试 cls-hooked(和 Async Hooks API,因为我使用的是 Node.js 版本 8)的足迹。

我已经实现了一个非常简单的 Express 应用程序,并在我的机器上使用和不使用 CLS 对其进行了测试。 CLS 的场景如下:

  • 在每个请求中都会生成一个带有 uuid/v4 的 ID然后存储在 CLS 中。这是由 cls-rtracer 中间件完成的。
  • 在路由中间件中,使用 winston 完成了一些日志记录,一个记录器库。该库配置为从 CLS 获取请求 ID 并将其附加到每个日志条目。

负载由 ab 生成效用。我使用的是 Windows 10 和 Node.js 10,但也在装有 Node.js 8 的 Ubuntu 虚拟机上进行了测试,得到了类似的结果。

结果,在打开请求 ID 和 CLS 的情况下,我的 RPS(每秒请求数)下降了大约 10-15%。至于 CPU 利用率,我没有发现这两种情况之间有任何重大差异,例如突然出现的峰值。

我已将我的测试应用作为要点发布:https://gist.github.com/puzpuzpuz/3c2a36ca0835906ad50dbd22c72df974

看起来像是一个迟到的回应,但它可能对将来的人有所帮助。这些场景应该非常接近真实世界的应用程序。

2020 年更新。从 v12.7.0 开始,Node.js 包括 AsyncLocalStorage应用程序接口(interface)。与 cls-hooked 和其他 CLS 库相比,此 CLS 核心 API 的占用空间要小得多。

关于node.js - Express:continuation-local-storage 可以处理什么负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50595130/

相关文章:

node.js - Node Express 测试模拟 res.status(status).json(obj)

mysql - 我想在nodejs中的mysql中添加一个变量

html - 在 Node.js 中包含 HTML 文件

javascript - 从 Node js 中的单独文件获取回调

javascript - 为什么 array = Array(10).fill(Array(20).fill(-1)) 与 array [[-1,..,-1], ..., [-1,.., -1]]?

node.js - 我如何测试响应是否已设置/发送?

javascript - NodeJS、websocket 和 module.export

node.js - module.exports 返回值未定义

跨多文件的 Typescript 命名空间

angular - 在 session 存储中保存用户对象