Function Compute admite dos hooks de ciclo de vida para las instancias de función Node.js: el Initializer hook, que se ejecuta una vez después de que se inicia una instancia, y el PreStop hook, que se ejecuta antes de que se destruya una instancia. Gestione con estos hooks los recursos —como las conexiones de base de datos— que deben inicializarse una vez por instancia y liberarse cuando la instancia se apaga.
Cómo funcionan los hooks de ciclo de vida
Una instancia de función pasa por las etapas que se muestran a continuación:
La instancia se inicia
El Initializer hook se ejecuta (una vez como máximo por instancia)
El Controlador se ejecuta para cada solicitud de invocación
La instancia se programa para su destrucción
El PreStop hook se ejecuta
La instancia se destruye
Los registros de ejecución de los hooks se facturan a la misma tarifa que las solicitudes de invocación normales. Sin embargo, los registros de los hooks solo aparecen en Function Logs, Real-time Logs y Advanced Logs; no aparecen en la lista de solicitudes de invocación. Para obtener más información, consulte Consulte los registros de los hooks de ciclo de vida.
Hook Initializer
El hook Initializer se ejecuta después de que una instancia de función se inicia y antes de que el controlador procese cualquier solicitud. Function Compute garantiza que el hook se ejecuta una vez como máximo por ciclo de vida de la instancia. Si el hook falla, Function Compute reintenta hasta que se ejecute correctamente antes de enrutar solicitudes a la instancia.
Utilice el hook Initializer para configurar recursos compartidos; por ejemplo, abrir una conexión de base de datos que todas las invocaciones posteriores pueden reutilizar, en lugar de volver a conectarse en cada llamada.
Firma del método
|
Aspecto |
Detalles |
|
Entrada |
|
|
Retorno |
No devuelve ningún valor. Llame a |
Ejemplos de código
Ambos ejemplos usan initialize como nombre de la función del hook. Este nombre debe coincidir con el nombre del Initializer hook configurado en la consola de Function Compute.
Módulos ECMAScript (Node.js 18 y versiones posteriores)
export const initialize = async (context) => {
console.log('initializer');
return "";
}
Módulos CommonJS
exports.initialize = function(context, callback) {
console.log('initializer');
callback(null, "");
};
Hook PreStop
El hook PreStop se ejecuta antes de que se destruya una instancia de función. Su firma de método es idéntica a la del hook Initializer: acepta context como única entrada y requiere una llamada a return o a callback para completarse.
Utilice el hook PreStop para liberar los recursos que mantiene la instancia; por ejemplo, cerrar las conexiones de base de datos antes de que la instancia se apague.
Las instancias de función se conservan en caché durante un periodo después de que el procesamiento se detiene, por lo que el hook PreStop no se ejecuta inmediatamente después de que termina una invocación. Para desencadenar PreStop rápidamente en pruebas, actualice la configuración o el código de la función; esto fuerza el reemplazo de la instancia existente, lo que desencadena el hook PreStop.
Ejemplos de código
Ambos ejemplos usan preStop como nombre de la función del hook. Este nombre debe coincidir con el nombre del PreStop hook configurado en la consola.
Módulos ECMAScript (Node.js 18 y versiones posteriores)
export const preStop = async (context) => {
console.log('preStop');
return "";
}
Módulos CommonJS
module.exports.preStop = function(context, callback) {
console.log('preStop');
callback(null, "");
}
Configure los hooks de ciclo de vida
Utilice la consola de Function Compute
En la consola de Function Compute, configure el hook Initializer y el hook PreStop en la configuración de la función. Para obtener detalles, consulte Configure los ciclos de vida de las instancias.
Especifique el nombre de cada hook con el formato [filename.methodname]:
|
Hook |
Valor |
Descripción |
|
Initializer hook |
|
El método |
|
PreStop hook |
|
El método |

Utilice Serverless Devs
Agregue instanceLifecycleConfig bajo props en el archivo s.yaml. Cada hook requiere un handler (en formato filename.methodname) y un timeout (en segundos).
edition: 3.0.0
name: hello-world-app
access: default
resources:
hello_world:
component: fc3
props:
region: cn-hangzhou
functionName: nodejs-fc-hooks
description: "Node.js lifecycle hooks by serverless devs"
runtime: nodejs20
code: ./code
handler: index.handler
memorySize: 128
timeout: 30
instanceLifecycleConfig:
preStop:
handler: index.preStop
timeout: 3
initializer:
handler: index.initialize
timeout: 3
internetAccess: true
logConfig: auto
Para consultar todos los campos YAML compatibles, consulte Comandos comunes de Serverless Devs.
Consulte los registros de los hooks de ciclo de vida
Inicie sesión en la consola de Function Compute. En el panel de navegación izquierdo, haga clic en Functions.
En la barra de navegación superior, seleccione una región. En la página Functions, haga clic en la función de destino.
En la página de detalles de la función, haga clic en la pestaña Test Function, haga clic en Test Function y, a continuación, elija Logs > Function Logs.
La pestaña Logs muestra tanto los registros de invocación como los registros de Initializer. Ejemplo:
2023-09-06 11:18:10 FC Initialize Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 load code for handler:index.initialize
2023-09-06 11:18:10 2023-09-06 11:18:10 1-64f7ef72-64caf1ff0046194d9a26bbd7 [verbose] initializer
2023-09-06 11:18:10 FC Initialize End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 FC Invoke Start RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
2023-09-06 11:18:10 load code for handler:index.handler
2023-09-06 11:18:10 FC Invoke End RequestId: 1-64f7ef72-64caf1ff0046194d9a26bbd7
Consulte los registros del hook PreStop: actualice la configuración o el código de la función para forzar el reemplazo de una instancia. Después de que la actualización se complete, los registros de PreStop aparecen en Function Logs. Ejemplo:
2023-09-06 11:08:10 FC PreStop Start RequestId: 944bca62-b209-47a1-9e48-2723647bce0a
2023-09-06 11:08:10 load code for handler:index.preStop
2023-09-06 11:08:10 2023-09-06 11:08:10 944bca62-b209-47a1-9e48-2723647bce0a [verbose] preStop
2023-09-06 11:08:10 FC PreStop End RequestId: 944bca62-b209-47a1-9e48-2723647bce0a
Programa de ejemplo
Un ejemplo completo de Node.js que usa ambos hooks con una base de datos MySQL está disponible en nodejs14-mysql. El hook Initializer lee la configuración de MySQL de las variables de entorno, crea una conexión y prueba la conectividad. El hook PreStop cierra la conexión.