我想为我的 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/