Configurazione di una funzione Lambda per lo streaming delle risposte - 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à.

Configurazione di una funzione Lambda per lo streaming delle risposte

È possibile configurare gli URL delle funzioni Lambda per trasmettere i payload di risposta ai client. Lo streaming delle risposte può favorire le applicazioni sensibili alla latenza migliorando le prestazioni del time to first byte (TTFB). Questo perché consente di inviare risposte parziali al client non appena diventano disponibili. Inoltre, lo streaming delle risposte permette di creare funzioni che restituiscono payload più grandi. I payload del flusso di risposta hanno un limite flessibile di 20 MB, a differenza del limite di 6 MB per le risposte bufferizzate. Lo streaming di una risposta significa anche che la funzione non deve contenere l'intera risposta in memoria. Per risposte molto grandi, ciò può ridurre la quantità di memoria necessaria per configurare la funzione.

La velocità con cui Lambda trasmette le tue risposte dipende dalla dimensione della risposta. La velocità di streaming per i primi 6 MB di risposta della funzione è illimitata. Per le risposte superiori a 6 MB, il resto della risposta è soggetto a un limite di larghezza di banda. Per ulteriori informazioni sulla larghezza di banda dello streaming, consulta la sezione Limiti di larghezza di banda per lo streaming delle risposte.

Lo streaming delle risposte comporta un costo. Per ulteriori informazioni, consulta la sezione Prezzi di AWS Lambda.

Lambda supporta lo streaming delle risposte sui runtime gestiti di Node.js. Per altri linguaggi, puoi utilizzare un runtime personalizzato con un'integrazione dell'API Runtime personalizzata per eseguire lo streaming delle risposte o utilizzare l'adattatore Web Lambda. Puoi trasmettere le risposte tramite gli URL delle funzioni Lambda, l'AWSSDK o l'API Lambda. InvokeWithResponseStream

Nota

Quando testi la funzione tramite la console Lambda, vedrai sempre le risposte come memorizzate nel buffer.

Scrittura di funzioni abilitate allo streaming delle risposte

La scrittura del gestore per le funzioni di streaming delle risposte è diversa dai modelli di gestore tipici. Quando scrivi funzioni di streaming, assicurati di completare le seguenti operazioni:

  • Racchiudi la funzione con il decoratore awslambda.streamifyResponse() fornito dai runtime nativi di Node.js.

  • Termina il flusso in modo corretto per assicurarti che tutta l'elaborazione dei dati sia completa.

Configurazione di un gestore delle funzioni per lo streaming delle risposte

Per indicare al runtime che Lambda deve trasmettere in streaming le risposte della funzione, è necessario racchiudere la funzione con il decoratore streamifyResponse(). Questo indica al runtime di utilizzare il percorso logico corretto per lo streaming delle risposte e consente alla funzione di trasmettere le risposte.

Il decoratore streamifyResponse() accetta una funzione che accetta i seguenti parametri:

  • event: fornisce informazioni sull'evento di chiamata dell'URL della funzione, ad esempio il metodo HTTP, i parametri della query e il corpo della richiesta.

  • responseStream: fornisce un flusso scrivibile.

  • context: fornisce i metodi e le proprietà con informazioni sulla chiamata, sulla funzione e sull'ambiente di esecuzione.

L'oggetto responseStream è un writableStream Node.js. Come con qualsiasi flusso di questo tipo, dovresti usare il metodo pipeline().

Esempio gestore abilitato allo streaming delle risposte
const pipeline = require("util").promisify(require("stream").pipeline); const { Readable } = require('stream'); exports.echo = awslambda.streamifyResponse(async (event, responseStream, _context) => { // As an example, convert event to a readable stream. const requestStream = Readable.from(Buffer.from(JSON.stringify(event))); await pipeline(requestStream, responseStream); });

Sebbene responseStream offra il metodo write() per scrivere sul flusso, ti consigliamo di utilizzare pipeline()laddove possibile. L'utilizzo di pipeline() garantisce che il flusso scrivibile non venga sopraffatto da un flusso leggibile più veloce.

Terminazione dello streaming

Assicurati di terminare correttamente il flusso prima che torni al gestore. Il metodo pipeline() gestisce questo aspetto automaticamente.

Per altri casi d'uso, chiama il metodo responseStream.end() per terminare correttamente un flusso. Questo metodo segnala che nel flusso non devono essere scritti altri dati. Questo metodo non è necessario se si scrive nel flusso con pipeline() o pipe().

Esempio di terminazione di un flusso con pipeline()
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
Esempio di terminazione di un flusso senza pipeline()
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });

Richiamo di una funzione abilitata allo streaming delle risposte utilizzando gli URL delle funzioni Lambda

Nota

È necessario richiamare la funzione utilizzando un URL della funzione per lo streaming delle risposte.

Puoi richiamare le funzioni abilitate allo streaming delle risposte modificando la modalità di richiamo dell'URL della funzione. La modalità di richiamo determina quale operazione API Lambda utilizza per richiamare la funzione. Le modalità di richiamo disponibili sono:

  • BUFFERED: questa è l'opzione predefinita. Lambda richiama la funzione utilizzando l'operazione API Invoke. I risultati delle chiamate sono disponibili quando il payload è completo. La dimensione massima del payload è pari a 6 MB.

  • RESPONSE_STREAM: consente alla funzione di trasmettere in streaming i risultati del payload non appena diventano disponibili. Lambda richiama la funzione utilizzando l'operazione API InvokeWithResponseStream. La dimensione massima del payload di risposta è 20 MB. Tuttavia, è possibile richiedere un aumento della quota.

Puoi comunque richiamare la funzione senza lo streaming delle risposte chiamando direttamente l'operazione API Invoke. Tuttavia, Lambda trasmette in streaming tutti i payload di risposta per le chiamate che arrivano tramite l'URL della funzione fino a quando non si modifica la modalità di richiamo in BUFFERED.

Creazione di un URL della funzione (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli il nome della funzione per la quale desideri impostare la modalità di richiamo.

  3. Scegli la scheda Configurazione, quindi scegli URL della funzione.

  4. Scegli Modifica, quindi scegli Impostazioni aggiuntive.

  5. In Modalità di richiamo, scegli la modalità di richiamo desiderata.

  6. Selezionare Salva.

Impostazione della modalità di richiamo di un URL della funzione (AWS CLI)

aws lambda update-function-url-config --function-name my-function --invoke-mode RESPONSE_STREAM

Impostazione della modalità di richiamo di un URL della funzione (AWS CloudFormation)

MyFunctionUrl: Type: AWS::Lambda::Url Properties: AuthType: AWS_IAM InvokeMode: RESPONSE_STREAM

Per ulteriori informazioni sulla configurazione degli URL della funzione, consulta URL della funzione Lambda.

Limiti di larghezza di banda per lo streaming delle risposte

I primi 6 MB del payload di risposta della funzione hanno una larghezza di banda illimitata. Dopo questa espansione iniziale, Lambda trasmette la tua risposta a una velocità massima di 2 MB/s. Se le risposte delle tue funzioni non superano mai i 6 MB, questo limite di larghezza di banda non verrà mai applicato.

Nota

I limiti di larghezza di banda si applicano solo al payload di risposta della funzione e non all'accesso alla rete da parte della funzione.

La velocità della larghezza di banda illimitata varia in base a una serie di fattori, inclusa la velocità di elaborazione della funzione. Normalmente puoi aspettarti una velocità superiore a 2 MB/s per i primi 6 MB di risposta della funzione. Se la funzione esegue lo streaming delle risposte a una destinazione esterna a AWS, la velocità di streaming dipende anche dalla velocità della connessione Internet esterna.