Pero es algo muy básico e interno. Se descubrió cuando comenzamos a analizar el almacenamiento local asíncrono, como, hey, podríamos usar esto para implementar este modelo. pero su rendimiento es realmente pobre.
Promise hooks es una API integrada en v8, realmente destinada a ayudar con este tipo de casos de uso. Lo que hace es configurar una serie de devoluciones de llamada que se pueden activar cuando se crea una promesa, cuando se resuelve, cuando ocurren todos los diferentes eventos del ciclo de vida de esa promesa. Pero eso se vuelve extremadamente costoso cuando invocas ese código cada vez que creas una promesa, cada vez que resuelves la promesa. Y como dije, las aplicaciones pueden crear decenas de miles, incluso cientos de miles de promesas en solo unos momentos de tiempo. Por lo tanto, ese código termina siendo extremadamente costoso de ejecutar cada vez.
Un problema clave aquí es que estamos propagando ese contexto. Estamos copiando esos pares clave-valor de un recurso de ejecución a otro. Cada vez que se crea una de esas continuaciones, no cuando el contexto realmente cambia, ¿verdad? Y eso es lo importante porque la información contextual real con la que estás tratando solo cambia muy, muy raramente, ¿verdad? Solo estás tratando con unas pocas instancias de estas cosas. Los valores generalmente se establecen una vez durante la aplicación. Ahora mismo, cada vez que creamos esas promesas, estamos copiando esos datos cada vez y se vuelve muy, muy costoso muy rápidamente.
Recientemente implementamos el almacenamiento local asíncrono en Cloudflare Workers. Esto es algo divertido. En realidad, no vamos a tener compatibilidad total con Node en Workers, pero tendremos cosas como node dot o node colon F o no FS, pero node colon net y node colon crypto, y muchas de estas cosas, estamos usando el especificador de nodo allí. Es obligatorio, al igual que en Dino. Está ahí. Y el almacenamiento local asíncrono es uno de los primeros que agregamos. Acaba de habilitarse, creo que el mes pasado, y está disponible para que todos lo usen. Pero lo hicimos sin usar async hooks o promise hooks. Pero a nivel de API, lo que usa el código es muy compatible con lo que tiene Node, pero lo hemos implementado de una manera completamente diferente.
Entonces, ¿cómo lo hacemos? Introdujimos esta cosa llamada un marco de contexto asíncrono. En lugar de almacenar todos esos pares clave-valor en el recurso de ejecución real, lo que hacemos es crear un marco solo cuando el dato realmente cambia. Entonces, inicialmente, cuando la aplicación se está ejecutando, no hay marco. No hemos establecido ningún valor. La primera vez que se utiliza una instancia de ALS, crearemos un marco y estableceremos ese valor y ese marco realmente mantiene ese mapa. El recurso de ejecución solo mantiene una referencia al marco actual. Entonces, cuando se crea ese recurso, simplemente lo vincularemos al marco actual. Solo creamos nuevos marcos cuando se especifica un nuevo valor.
Comments