3

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

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

4

1 回答 1

4

最近我在玩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 VM 上进行了测试,得到了类似的结果。

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

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

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

2020 年更新。从 v12.7.0 开始,Node.js 包含AsyncLocalStorage API。cls-hooked与其他 CLS 库相比,此 CLS 核心 API 的占用空间显着降低。

于 2018-12-06T08:43:12.813 回答