2016-06-20 54 views
14

Pianifica una funzione lambda per essere richiamata ogni 20 minuti con CloudWatch il modo migliore per sbarazzarsi degli orari di avvio a freddo lambda? (non del tutto sbarazzato) ...Lambda cold start possible soluzione?

Questo sarà costoso o c'è qualcosa che mi manca perché l'ho impostato in questo momento e penso che funzioni.

Prima che l'ora di avvio a freddo fosse pari a 10 secondi e ogni chiamata successiva sarebbe stata completata in 80 ms. Ora ogni chiamata, non importa quanto frequente è di circa 80 ms. È un buon metodo fino a quando la tua base di utenti non cresce, quindi puoi disattivarla?

La mia seconda opzione è l'utilizzo di beanstalk e l'esecuzione di un server 24 ore su 24, 7 giorni su 7, ma mi sembra costoso, quindi non lo preferisco.

risposta

13

Per quanto ne so questo è l'unico modo per mantenere la funzione al momento. Può diventare costoso solo quando hai molte di quelle funzioni.

Dovresti calcolare tu quanto paghi per mantenere vive le tue funzioni considerando quanti di essi hai, quanto tempo ci vuole per eseguirle ogni volta e quanta memoria hai bisogno.

Ma una volta ogni 20 minuti è qualcosa come 2000 volte al mese, quindi se si utilizza ad es. 128 MB e farli finire sotto 100 ms, allora potresti mantenere molte funzioni simili a intervalli di 20 minuti e rimanere al di sotto del livello gratuito - sarebbero 20 secondi al mese per funzione. Non hai nemmeno bisogno di spegnerlo dopo aver ottenuto un carico maggiore perché sarà irrilevante a questo punto. Inoltre, non puoi mai essere sicuro di avere un carico uniforme per tutto il tempo in modo da poter mantenere attivo il tuo battito cardiaco anche in quel momento.

Anche se la mia ipotesi è che dal momento che è così a buon mercato mantenere una funzione in vita (soprattutto se si dispone di un argomento speciale che li fa tornare immediatamente) e che la differenza è così grande (10 secondi contro 80 ms) poi bella molti lo faranno - non c'è praticamente nessuna scusa per non farlo. In tal caso, mi aspetto che Amazon possa combattere questa pratica (rendendola difficile o più costosa di quella attuale), che non sarebbe una mossa intelligente o renderla non necessaria in futuro. Se la differenza tra l'avviamento a caldo e quello a freddo era 100ms, nessuno si preoccuperebbe di farlo. Se è 10 secondi di quello che tutti hanno bisogno di aggirare.

Ci sarebbe sempre stata una differenza tra l'esecuzione di un codice eseguito un secondo prima e un codice eseguito un mese fa, perché avere tutti nella RAM e pronti per andare sprecare un sacco di risorse, ma non vedo alcuna ragione per cui questa differenza non possa essere resa meno evidente o addirittura avere pochi passi in più, invece di iniziare a caldo e a freddo.

+0

Grazie per il suggerimento. C'è qualcosa in particolare esternamente al codice funzione che può ritardare un avvio? Ho 2 nodijs lambda, anche se anche da chiamate fredde, uno (158Kb) inizia sotto ~ 1 sec, mentre un altro in VPC-Elasticache (54Kb) richiede circa 10 secondi. Ma forse ciò ha a che fare solo con la libreria redis che carica, che potrebbe essere intensa per la CPU, piuttosto che la stessa configurazione? – zanona

5

È possibile migliorare il tempo di avviamento a freddo assegnando più memoria alla funzione Lambda. Con il 512 MB predefinito, vedo i tempi di avvio a freddo di 8-10 secondi per le funzioni scritte in Java. Questo migliora fino a 2-3 secondi con 1536 MB di memoria.

Amazon says che è l'allocazione della CPU che conta davvero, ma non c'è modo di cambiarlo direttamente. L'allocazione della CPU aumenta proporzionalmente alla memoria.

E se si desidera chiudere a zero gli orari di avviamento a freddo, mantenere la funzione calda è la strada da percorrere, come suggerito da rsp.

+2

L'impostazione della memoria su 1536mb funziona per me.Tempo di avvio a freddo ridotto da 12 secondi a 3 secondi. – Guus

+0

I big lambda iniziano più velocemente, inoltre raccolgono i rifiuti in precedenza. In altre parole, il loro timeout inattivo è più breve. – sepehr