Compartir contexto de recursos asincrónico significa compartir datos de contexto dentro de un ciclo de vida de solicitud de red o cadena de llamadas de recursos asincrónicos.
Antes de responder a esta pregunta, primero debemos entender qué son los recursos asincrónicos.
Los recursos asincrónicos pueden entenderse como objetos con devoluciones de llamada, como, entre otros, promesas, tiempos de espera, TCPWrap, UDP, etc. Consulte la lista de tipos de recursos asincrónicos para obtener más detalles.
La definición oficial es la siguiente:
Un recurso asincrónico representa un objeto con una devolución de llamada asociada. Esta devolución de llamada se puede llamar varias veces, como el evento de 'conexión' en net.createServer(), o solo una vez como en fs.open. () También se puede cerrar un recurso antes de llamar a la devolución de llamada.
Aquí presentamos AsyncLocalStorage, la solución para compartir contexto asíncrono proporcionada oficialmente por Node.js. Esta característica todavía era una característica experimental antes de 16.4.0 y ha sido estable desde 16.4. .0.
AsyncLocalStorage puede compartir datos en una cadena de operaciones asincrónicas.
La instancia de AsyncLocalStorage asyncLocalStorage tiene los siguientes métodos principales:
Ejemplo:
const store = { id: 1 }; // Reemplaza la tienda anterior con el objeto de tienda dado asyncLocalStorage.enterWith(tienda); asyncLocalStorage.getStore(); // Devuelve el objeto de la tienda algunaOperaciónAsync(() => { asyncLocalStorage.getStore(); // Devuelve el mismo objeto });
El primer parámetro de la función asyncLocalStorage.run() es almacenar los datos compartidos a los que necesitamos acceder en la llamada asincrónica, y el segundo parámetro es una función asincrónica.
El siguiente es un ejemplo para demostrar cómo utilizar AsyncLocalStorage para implementar el uso compartido asincrónico del contexto de recursos:
Salida:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 este es un mensaje de registro runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 este es un mensaje de registro
En la misma función asincrónica ejecutada a través de asyncLocalStorage.run, las funciones runA y runB se ejecutarán, y runA y runB pueden acceder a los mismos datos de contexto.
AsyncLocalStorage nos proporciona un gran recorrido para implementar fácilmente el intercambio asincrónico de contexto de recursos en Node.js, pero cada operación de recursos asincrónicos activará Async Hooks, lo que inevitablemente tendrá un cierto impacto en el rendimiento de nuestra aplicación Node. Entonces, ¿qué tan grande es el impacto?
Según una medición real de Kuzzle, el uso de AsyncLocalStorage provocará una pérdida de rendimiento adicional de aproximadamente un 8%. Por supuesto, diferentes escenarios comerciales pueden tener un rendimiento diferente. Si le preocupa esta parte del rendimiento, también puede agregar pruebas comparativas a su negocio para probar el impacto específico en el rendimiento.
---- | Iniciar sesión con | AsyncLocalStorage | Registrar |
---|---|---|---|
requisitos de | diferencia clásicos2613 | 2842 | ~8% |
En otros lenguajes de subprocesos múltiples, cada HTTP crea un nuevo subproceso y cada subproceso tiene su propia memoria. Puede almacenar el estado global en la memoria del subproceso y recuperar el estado global desde cualquier lugar de su código.
En Node.js, debido a que Node.js tiene un solo subproceso y comparte memoria entre todas las solicitudes HTTP, cada solicitud HTTP no puede mantener un estado global aislado entre sí.
AsyncLocalStorage puede aislar eficazmente el estado entre diferentes operaciones asincrónicas y desempeña un papel muy importante en escenarios como el seguimiento de solicitudes HTTP, herramientas APM, seguimiento de registros de contexto y seguimiento de registros de enlace completo basado en solicitudes.