Konfigurieren einer Lambda-Funktion zum Streamen von Antworten - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Konfigurieren einer Lambda-Funktion zum Streamen von Antworten

Sie können Ihre Lambda-Funktions-URLs so konfigurieren, dass sie Antwort-Nutzlasten zurück an Clients streamen. Antwort-Streaming kann für latenzempfindliche Anwendungen von Vorteil sein, da es die Leistung in der Zeit bis zum ersten Byte (TTFB) verbessert. Dies liegt daran, dass Sie Teilantworten an den Client zurücksenden können, sobald sie verfügbar sind. Darüber hinaus können Sie Response-Streaming verwenden, um Funktionen zu erstellen, die größere Nutzlasten zurückgeben. Die Nutzlasten von Antwortstreams haben ein Soft-Limit von 20 MB im Vergleich zu den 6 MB für gepufferte Antworten. Das Streameng einer Antwort bedeutet auch, dass Ihre Funktion nicht die gesamte Antwort im Speicher unterbringen muss. Bei sehr großen Antworten kann dies die Menge des Speichers reduzieren, die Sie für Ihre Funktion konfigurieren müssen.

Die Geschwindigkeit, mit der Lambda Ihre Antworten streamt, hängt von der Größe der Antwort ab. Die Streaming-Rate für die ersten 6 MB der Antwort Ihrer Funktion ist nicht begrenzt. Bei Antworten, die größer als 6 MB sind, gilt für den Rest der Antwort eine Bandbreitenbegrenzung. Weitere Informationen zur Streaming-Bandbreite finden Sie unter Bandbreitenbegrenzung für Antwort-Streaming.

Das Streamen von Antworten ist mit Kosten verbunden. Weitere Informationen finden Sie unter AWS Lambda-Preisgestaltung.

Lambda unterstützt Antwortstreaming auf verwalteten Laufzeiten von Node.js. Für andere Sprachen können Sie eine benutzerdefinierte Laufzeit auch mit einer benutzerdefinierten Laufzeit-API-Integration verwenden, um Antworten zu streamen, oder den Lambda Web Adapter verwenden. Sie können Antworten über Lambda-Funktions-URLs, das SDK AWS oder mithilfe der Lambda-InvokeWithResponseStreamAPI streamen.

Anmerkung

Wenn Sie Ihre Funktion über die Lambda-Konsole testen, werden die Antworten immer gepuffert angezeigt.

Schreiben von Antwort-Streaming-fähigen Funktionen

Das Schreiben des Handlers für Antwort-Streaming-Funktionen unterscheidet sich von typischen Handler-Mustern. Wenn Sie Streaming-Funktionen schreiben, sollten Sie Folgendes beachten:

  • Verpacken Sie Ihre Funktion mit dem awslambda.streamifyResponse()-Decorator, den die nativen Laufzeiten von Node.js zur Verfügung stellen..

  • Beenden Sie den Stream ordnungsgemäß, um sicherzustellen, dass die Datenverarbeitung abgeschlossen ist.

Konfigurieren einer Handler-Funktion zum Streamen von Antworten

Um der Laufzeit zu signalisieren, dass Lambda die Antworten Ihrer Funktion streamen soll, müssen Sie Ihre Funktion mit dem streamifyResponse()-Decorator wrappen. Dadurch wird die Laufzeit angewiesen, den richtigen Logikpfad für Streaming-Antworten zu verwenden, und ermöglicht es der Funktion, Antworten zu streamen.

Der streamifyResponse()-Decorator akzeptiert eine Funktion, die die folgenden Parameter akzeptiert:

  • event – Stellt Informationen über das Aufrufereignis der Funktions-URL bereit, z. B. die HTTP-Methode, Abfrageparameter und den Anforderungskörper.

  • responseStream – Stellt einen schreibbaren Stream bereit.

  • context – Stellt Methoden und Eigenschaften mit Informationen zum Aufruf, zur Funktion und zur Ausführungsumgebung bereit.

Das responseStream-Objekt ist ein Node.js writableStream. Wie bei jedem solchen Stream sollten Sie die pipeline()-Methode verwenden.

Beispiel Handler mit aktiviertem Antwort-Streaming
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); });

Obwohl responseStream die write()-Methode bietet, in den Stream zu schreiben, empfehlen wir Ihnen, wo immer möglich, pipeline() zu verwenden. Die Verwendung von pipeline() stellt sicher, dass der schreibbare Stream nicht von einem schneller lesbaren Stream überfordert wird.

Den Stream beenden

Stellen Sie sicher, dass Sie den Stream ordnungsgemäß beenden, bevor der Handler zurückkehrt. Die pipeline()-Methode verarbeitet dies automatisch.

Für andere Anwendungsfälle rufen Sie die responseStream.end()-Methode auf, um einen Stream ordnungsgemäß zu beenden. Diese Methode signalisiert, dass keine Daten mehr in den Stream geschrieben werden sollen. Diese Methode ist nicht erforderlich, wenn Sie mit pipeline() oder pipe() in den Stream schreiben.

Beispiel für das Beenden eines Streams mit Pipeline ()
const pipeline = require("util").promisify(require("stream").pipeline); exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { await pipeline(requestStream, responseStream); });
Beispiel für das Beenden eines Streams ohne Pipeline ()
exports.handler = awslambda.streamifyResponse(async (event, responseStream, _context) => { responseStream.write("Hello "); responseStream.write("world "); responseStream.write("from "); responseStream.write("Lambda!"); responseStream.end(); });

Aufrufen einer Antwort-Streaming-fähigen Funktion mit Lambda-Funktions-URLs

Anmerkung

Sie müssen Ihre Funktion mit einer Funktions-URL aufrufen, um die Antworten zu streamen.

Sie können Funktionen mit aktiviertem Antwort-Streaming aufrufen, indem Sie den Aufrufmodus der URL Ihrer Funktion ändern. Der Aufrufmodus bestimmt, welche API-Operation Lambda verwendet, um Ihre Funktion aufzurufen. Die verfügbaren Aufrufmodi sind:

  • BUFFERED – Dies ist die Standardoption. Lambda ruft Ihre Funktion mithilfe der Invoke-API-Operation auf. Die Aufrufergebnisse sind verfügbar, wenn die Nutzlast abgeschlossen ist. Die maximale Nutzlastgröße beträgt 6 MB.

  • RESPONSE_STREAM – Ermöglicht es Ihrer Funktion, die Ergebnisse der Nutzlasten zu streamen, sobald sie verfügbar sind. Lambda ruft Ihre Funktion mithilfe der InvokeWithResponseStream-API-Operation auf. Die maximale Nutzlastgröße beträgt 20 MB. Sie können allerdings eine Kontingenterhöhung beantragen.

Sie können Ihre Funktion auch ohne Antwort-Streaming aufrufen, indem Sie die Invoke-API-Operation direkt aufrufen. Lambda streamt jedoch alle Antwort-Nutzlasten für Aufrufe, die über die URL der Funktion erfolgen, bis Sie den Aufrufmodus auf BUFFERED ändern.

Um den Aufrufmodus einer Funktions-URL (Konsole) festzulegen
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie den Namen der Funktion, für die Sie den Aufrufmodus festlegen möchten.

  3. Wählen Sie die Registerkarte Konfiguration und dann Funktions-URL.

  4. Wählen Sie Bearbeiten und dann Zusätzliche Einstellungen.

  5. Wählen Sie unter Aufrufmodus den gewünschten Aufrufmodus aus.

  6. Wählen Sie Speichern.

Um den Aufrufmodus einer Funktions-URL (AWS CLI) festzulegen

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

Um den Aufrufmodus einer Funktions-URL (AWS CloudFormation) festzulegen

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

Weitere Hinweise zum Konfigurieren von Funktions-URLs finden Sie unter Lambda-Funktions-URLs.

Bandbreitenbegrenzung für Antwort-Streaming

Für die ersten 6 MB der Nutzlast Ihrer Funktion gibt es keine Bandbreitenbegrenzung. Nach diesem ersten Burst streamt Lambda Ihre Antwort mit einer maximalen Rate von 2 MB/s. Wenn Ihre Funktionsantworten nie größer als 6 MB sind, gilt diese Bandbreitenbegrenzung nicht.

Anmerkung

Bandbreitenbegrenzungen gelten nur für die Antwortnutzlast Ihrer Funktion und nicht für den Netzwerkzugriff durch Ihre Funktion.

Die Rate der unbegrenzten Bandbreite hängt von einer Reihe von Faktoren ab, einschließlich der Verarbeitungsgeschwindigkeit Ihrer Funktion. Normalerweise können Sie für die ersten 6 MB der Antwort Ihrer Funktion eine Rate von mehr als 2 MB/s erwarten. Wenn Ihre Funktion eine Antwort an ein Ziel außerhalb von AWS streamt, hängt die Streaming-Rate auch von der Geschwindigkeit der externen Internetverbindung ab.