Implementa il codice prima o dopo le istantanee della funzione Lambda - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Implementa il codice prima o dopo le istantanee della funzione Lambda

Gli hook di runtime possono essere utilizzati per implementare il codice prima che Lambda crei uno snapshot o dopo che ha ripristinato una funzione da uno snapshot. Gli hook di runtime sono disponibili come parte del progetto open source Coordinated Restore at Checkpoint (CRaC). CRaC è in fase sviluppo per l'Open Java Development Kit (OpenJDK). Per un esempio di come usare cRac con un'applicazione di riferimento, consulta il repository cRac su. GitHub Il CRaC utilizza tre elementi principali:

  • Resource: un'interfaccia con due metodi, beforeCheckpoint() e afterRestore(). Utilizza questi metodi per implementare il codice che desideri eseguire prima di uno snapshot e dopo un ripristino.

  • Context <R extends Resource>: per ricevere notifiche relative ai checkpoint e ai ripristini, è necessario registrare una Resource con un Context.

  • Core: il servizio di coordinamento, che fornisce il Context globale predefinito tramite il metodo statico Core.getGlobalContext().

Per ulteriori informazioni su Context e Resource, consulta Pacchetto org.crac nella documentazione di CRaC.

Completa le seguenti operazioni per implementare gli hook di runtime con il pacchetto org.crac. Il runtime Lambda contiene un'implementazione del contesto CRaC personalizzata che chiama gli hook di runtime prima del checkpoint e dopo il ripristino.

Fase 1: aggiornamento della configurazione di build

Aggiungi la dipendenza org.crac alla configurazione della build. Nell'esempio seguente viene utilizzato Gradle. Per esempi di altri sistemi di compilazione, consulta la documentazione di 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' }

Fase 2: aggiornamento del gestore Lambda

Il gestore di funzioni Lambda è il metodo nel codice della funzione che elabora gli eventi. Quando viene richiamata la funzione, Lambda esegue il metodo del gestore. La funzione viene eseguita fino a quando il gestore non restituisce una risposta, termina o scade.

Per ulteriori informazioni, consulta Definisci il gestore di funzioni Lambda in Java.

Il seguente gestore di esempio mostra come eseguire il codice prima del checkpoint (beforeCheckpoint()) e dopo il ripristino (afterRestore()). Questo gestore registra anche la Resource nel Context gestito dal runtime.

Nota

Quando Lambda crea uno snapshot, il codice di inizializzazione può essere eseguito per un massimo di 15 minuti. Il limite di tempo è 130 secondi o il timeout della funzione configurato (massimo 900 secondi), a seconda di quale dei due valori sia più elevato. I tuoi hook di runtime beforeCheckpoint() contano ai fini del limite di tempo del codice di inizializzazione. Quando Lambda ripristina uno snapshot, il runtime (JVM) deve essere caricato e gli hook di runtime afterRestore() devono essere completati entro il limite di timeout (10 secondi). Altrimenti, otterrai un. 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 un WeakReference all'oggetto registrato. Se per una Resource viene eseguita la rimozione di oggetti inutili (garbage collection), gli hook di runtime non vengono eseguiti. Il codice deve mantenere un forte riferimento alla Resource per garantire l'esecuzione dell'hook di runtime.

Ecco due esempi di modelli da evitare:

Esempio : oggetto senza un forte riferimento
Core.getGlobalContext().register( new MyResource() );
Esempio : oggetti di classi anonime
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 { // ... } } );

Invece, mantieni un riferimento forte. Nell'esempio seguente, per la risorsa registrata non viene eseguita la rimozione di oggetti inutili (garbage collection) e gli hook di runtime vengono eseguiti in modo coerente.

Esempio : oggetto con un forte riferimento
Resource myResource = new MyResource(); // This reference must be maintained to prevent the registered resource from being garbage collected Core.getGlobalContext().register( myResource );