Implemente el código antes o después de las instantáneas de la función de Lambda - AWS Lambda

Implemente el código antes o después de las instantáneas de la función de Lambda

Puede utilizar enlaces de tiempo de ejecución para implementar el código antes de que Lambda cree una instantánea o después de que Lambda restaure una función desde una instantánea. Los enlaces de tiempo de ejecución están disponibles como parte del proyecto Coordinated Restore at Checkpoint (CRaC) de código abierto. El CRaC está en desarrollo para el Open Java Development Kit (OpenJDK). Para ver un ejemplo de cómo utilizar CRaC con una aplicación de referencia, visite el repositorio de CRaC en GitHub. CRaC utiliza tres elementos principales:

  • Resource: una interfaz con dos métodos, beforeCheckpoint() y afterRestore(). Utilice estos métodos para implementar el código que desea ejecutar antes de una instantánea y después de una restauración.

  • Context <R extends Resource>: para recibir notificaciones de puntos de comprobación y restauraciones, debe haber un Resource con un Context.

  • Core: el servicio de coordinación, que proporciona el Context global predeterminado mediante el método estático Core.getGlobalContext().

Para obtener más información sobre Context y Resource, consulte Package org.crac en la documentación de CRaC.

Siga los siguientes pasos para implementar enlaces de tiempo de ejecución con Package org.crac. El tiempo de ejecución de Lambda contiene una implementación contextual de CRaC personalizada que invoca los enlaces de tiempo de ejecución antes de realizar comprobaciones y después de restaurarlos.

Paso 1: Actualizar la configuración de compilación

Agregue la dependencia org.crac a la configuración de compilación. El siguiente ejemplo utiliza Gradle. Para ver ejemplos de otros sistemas de compilación, consulte la documentación de Apache Maven.

dependencies { compile group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1' # All other project dependecies go here: # ... # Then, add the org.crac dependency: implementation group: 'org.crac', name: 'crac', version: '1.4.0' }

Paso 2: Actualizar del controlador de Lambda

El controlador de la función de Lambda es el método del código de la función que procesa eventos. Cuando se invoca una función, Lambda ejecuta el método del controlador. La función se ejecuta hasta que el controlador devuelve una respuesta, se cierra o se agota el tiempo de espera.

Para obtener más información, consulte Definir el controlador de las funciones de Lambda en Java.

El siguiente controlador de ejemplo muestra cómo ejecutar el código antes de comprobar (beforeCheckpoint()) y después de restaurarlo (afterRestore()). Este controlador también registra el Resource al Context global administrado en tiempo de ejecución.

nota

Cuando Lambda crea una instantánea, el código de inicialización puede ejecutarse durante un máximo de 15 minutos. El límite de tiempo es de 130 segundos o el tiempo de espera de la función configurado (máximo de 900 segundos), lo que sea mayor. Los enlaces en tiempo de ejecución beforeCheckpoint() cuentan para el límite de tiempo del código de inicialización. Cuando Lambda restaura una instantánea, el tiempo de ejecución (JVM) debe cargarse y los enlaces de tiempo de ejecución afterRestore() deben completarse antes de que transcurra el tiempo de espera (10 segundos). De lo contrario, obtendrá una excepción SnapStartTimeoutException.

... import org.crac.Resource; import org.crac.Core; ... public class CRaCDemo implements RequestStreamHandler, Resource { public CRaCDemo() { Core.getGlobalContext().register(this); } public String handleRequest(String name, Context context) throws IOException { System.out.println("Handler execution"); return "Hello " + name; } @Override public void beforeCheckpoint(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("Before checkpoint"); } @Override public void afterRestore(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("After restore");

Context mantiene solo una WeakReference para el objeto registrado. Si un Resource es una recopilación de elementos no utilizados, los enlaces de tiempo de ejecución no se ejecutan. Su código debe mantener una referencia segura para el Resource para garantizar que se ejecute el enlace de tiempo de ejecución.

Estos son dos ejemplos de patrones que se deben evitar:

ejemplo — Objeto sin una referencia sólida
Core.getGlobalContext().register( new MyResource() );
ejemplo — Objetos de clases anónimas
Core.getGlobalContext().register( new Resource() { @Override public void afterRestore(Context<? extends Resource> context) throws Exception { // ... } @Override public void beforeCheckpoint(Context<? extends Resource> context) throws Exception { // ... } } );

En su lugar, mantenga una referencia sólida. En el siguiente ejemplo, el recurso registrado no es una recopilación de elementos no utilizados y los enlaces de tiempo de ejecución se ejecutan de manera uniforme.

ejemplo — Objeto con una referencia sólida
Resource myResource = new MyResource(); // This reference must be maintained to prevent the registered resource from being garbage collected Core.getGlobalContext().register( myResource );