21

E 'noto che AWS lambda può riutilizzo presto creato oggetti di gestori, ed è veramente lo fa (vedi FAQ):AWS lambda e la concorrenza Java

D: casi di funzione riutilizzo AWS Lambda?

Per migliorare le prestazioni, AWS Lambda può scegliere di mantenere un'istanza di vostra funzione e riutilizzarlo per servire una richiesta successiva, piuttosto che la creazione di una nuova copia. Il tuo codice non dovrebbe presumere che questo sarà sempre .


La domanda è per quanto riguarda ad Java concorrenza. Se ho classe per il gestore, dire:

public class MyHandler { 
    private Foo foo; 
    public void handler(Map<String,String> request, Context context) { 
     ... 
    } 
} 

così, sarà thread-safe per l'accesso e lavorare con la variabile oggetto foo qui o no?

In altre parole: può lambda utilizzare lo stesso oggetto contemporaneamente per chiamate diverse?

EDIT La mia funzione viene elaborata sull'origine basata su eventi, in particolare viene invocata dal metodo gateway API.

EDIT-2 Questo tipo di domanda aumenta quando si desidera implementare un tipo di pool di connessioni a risorse esterne, quindi voglio mantenere la connessione a una risorsa esterna come variabile dell'oggetto. Funziona davvero come desiderato, ma ho paura dei problemi di concorrenza.

EDIT-3 In particolare mi chiedo: CAN istanze di gestori di AWS lambda quota mucchio comune (memoria) o no? Devo specificare questo ulteriore dettaglio per evitare risposte con l'elencazione di cose ovvie e comuni su oggetti java-thread-safe.

+0

IMO "conserva un'istanza della funzione e riutilizzala" è esattamente la stessa di "usa lo stesso oggetto". E molto probabilmente contemporaneamente. – zapl

+0

@zapl Non significa esattamente contemporaneamente. Può essere usato come thread all'interno di java 'ExecutorService' - sono mantenuti, ma non usati simultaneamente – Andremoniy

+0

Certo, potrebbero creare nuove istanze di handler per thread o garantire che non vengano usati contemporaneamente ma non li vedo menzionati esplicitamente da nessuna parte. D'altra parte, ci sono pezzi come * "Il codice deve essere scritto in uno stile" apolide "[...] gli artefatti non possono estendersi oltre la durata della richiesta" * nelle FAQ. – zapl

risposta

38

Può lambda utilizzare lo stesso oggetto contemporaneamente per chiamate diverse?

Possono le istanze di gestori di lambda AWS condividere l'heap comune (memoria) o no?

Un NO forte e preciso. Le istanze di gestori di AWS Lambda non possono nemmeno condividere file (in /tmp).

Un contenitore AWS Lambda può non essere riutilizzato per due o più simultaneamente invocazioni esistenti di una funzione lambda, dal momento che sarebbe rompere il requisito isolamento:

Q: How does AWS Lambda isolate my code?

Ogni piste funzione AWS Lambda nel proprio ambiente isolato, con le proprie risorse e vista del file system.

La sezione "Come fa AWS Lambda Run My Code Il Modello container?" nella descrizione ufficiale della how lambda functions work stati: viene eseguito

Dopo una funzione lambda, AWS Lambda mantiene il contenitore per un po 'di tempo in previsione di un'altra invocazione della funzione Lambda . In effetti, il servizio congela il contenitore dopo che una funzione Lambda completa e scongela il contenitore per il riutilizzo, se AWS Lambda sceglie di riutilizzare il contenitore quando la funzione Lambda è richiamata di nuovo. Questo approccio contenitore riuso ha le seguenti implicazioni:

  • Eventuali dichiarazioni contenute nel codice funzione lambda rimane inizializzato, fornendo ulteriore ottimizzazione quando la funzione viene richiamata di nuovo. Ad esempio, se la funzione Lambda stabilisce una connessione al database , invece di ristabilire la connessione, la connessione originale viene utilizzata nelle successive chiamate. È possibile aggiungere la logica nel codice per verificare se esiste già una connessione prima di crearne una.

  • Ogni contenitore fornisce uno spazio su disco nella directory/tmp. Il contenuto della directory rimane quando il contenitore è congelato, fornendo la cache temporanea che può essere utilizzata per più chiamate. È possibile aggiungere il codice aggiuntivo per verificare se la cache contiene i dati memorizzati.

  • processi in background o callback avviati dalla funzione Lambda che non hanno completato quando la ripresa è conclusa funzione se AWS Lambda sceglie di riutilizzare il contenitore. È necessario assicurarsi che qualsiasi background processi o callback (nel caso di Node.js) nel codice siano completi prima che il codice venga chiuso.

Come si può vedere, non c'è assolutamente nessun avvertimento sulle condizioni di competizione tra più invocazioni concorrenti di una funzione lambda quando si cerca di trarre vantaggio da contenitore riutilizzo. L'unica nota è "non fare affidamento su di esso!".

+0

Questa è la risposta perfetta, grazie mille – Andremoniy

+0

il premio verrà assegnato appena possibile SO (22 ore rimanenti) – Andremoniy