Búsqueda de sitios web

node.js - Express: ¿qué carga puede manejar continuation-local-storage?


Quiero habilitar almacenamiento similar a hilos para mi aplicación express que maneja aproximadamente de 100 a 300 llamadas a la API por minuto. He probado con continuation-local-storage (y cls-hooked ya que estoy en Node 8.9.0) pero los picos de CPU son muy altos (500 veces lo normal y no se estabilizan) y han causado que el servidor se caiga. Los endpoints mayormente realizan cálculos sincrónicos ligeros en la CPU (por ejemplo, llamando a APIs, haciendo búsquedas, rara vez tareas intensivas en I/O)

¿Alguien tiene experiencia ejecutando csl a gran escala con Express?

Respuesta #1

Recientemente estaba jugando con cls-rtracer, mi pequeña biblioteca para Express y Koa. Esta biblioteca es solo una colección de middlewares ligeros construidos sobre cls-hooked. Así que básicamente estaba probando la huella de cls-hooked (y la API de Async Hooks, ya que estaba usando la versión 8 de Node.js).

He implementado una aplicación muy simple de Express y la he probado en mi máquina con y sin CLS. El escenario con CLS fue el siguiente:

  • En cada solicitud se generaba un id con uuid/v4 y luego se almacenaba en CLS. Esto se hizo mediante el middleware cls-rtracer.
  • En el middleware de ruta, se realizó algún registro con winston, una biblioteca de registro. La biblioteca estaba configurada para obtener el id de la solicitud de CLS y añadirlo a cada entrada de registro.

La carga fue generada por la utilidad ab. Estaba usando Windows 10 y Node.js 10, pero también lo probé en una VM de Ubuntu con Node.js 8 y obtuve resultados similares.

Como resultado, obtuve aproximadamente un 10-15% de degradación en RPS (solicitudes por segundo) con los IDs de solicitud y CLS activados. En cuanto a la utilización de la CPU, no vi ninguna diferencia importante, como picos repentinos, entre estos dos escenarios.

He publicado mi aplicación de prueba como un gist: https://gist.github.com/puzpuzpuz/3c2a36ca0835906ad50dbd22c72df974

Parece una respuesta tardía, pero puede ayudar a alguien en el futuro. Estos escenarios deberían estar bastante cerca de aplicaciones del mundo real.

Actualización 2020. A partir de la v12.7.0, Node.js incluye la API AsyncLocalStorage. Esta API central de CLS tiene una huella significativamente menor en comparación con cls-hooked y otras bibliotecas CLS.

Artículos relacionados