21

Es ist bekannt, dass AWS Lambda kann Wiederverwendung frühen Objekte von Handler erstellt, und es wirklich funktioniert es (siehe FAQ):AWS Lambda und Java Concurrency

F: Wird AWS Lambda Wiederverwendung Funktion Instanzen?

Leistung zu verbessern, können AWS Lambda wählen Sie eine Instanz von Ihre Funktion zu behalten und wiederverwenden es eine nachfolgende Anforderung zu dienen, anstatt eine neue Kopie zu erstellen. Dein Code sollte nicht davon ausgehen, dass dies immer passieren wird.


Die Frage ist in Bezug auf Java Gleichzeitigkeit. Wenn ich Klasse für Handler haben, sagen:

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

so wird es für Thread-sicher zugänglich sein und foo hier mit Objektvariablen arbeiten oder nicht?

Mit anderen Worten: darf AWS Lambda dasselbe Objekt gleichzeitig für verschiedene Aufrufe verwenden?

BEARBEITEN Meine Funktion wird auf ereignisbasierter Quelle verarbeitet, insbesondere wird sie von der API-Gateway-Methode aufgerufen.

EDIT-2 Eine solche Frage erhebt sich, wenn Sie eine Art Verbindungspool zu externen Ressourcen implementieren möchten, also möchte ich die Verbindung zu externen Ressourcen als Objektvariable beibehalten. Es funktioniert tatsächlich wie gewünscht, aber ich habe Angst vor Nebenläufigkeitsproblemen.

EDIT-3 Genauer gesagt frage ich mich: können Instanzen der Handler von AWS Lambda-Anteil gemeinsamen Heap (Speicher) oder nicht? Ich muss dieses zusätzliche Detail spezifizieren, um Antworten mit der Auflistung von offensichtlichen und allgemein bekannten Dingen über Java thread-safe Objekte zu verhindern.

+0

IMO „eine Instanz Ihrer Funktion behalten und wiederverwenden“ genau wie „verwenden gleiches Objekt“ ist das gleiche. Und sehr wahrscheinlich gleichzeitig. – zapl

+0

@zapl Es bedeutet nicht genau gleichzeitig. Es kann wie Threads innerhalb Java verwendet werden 'ExecutorService' - sie werden beibehalten, aber nicht gleichzeitig – Andremoniy

+0

sicher verwendet werden, könnten sie neue Handler Instanzen pro Thread erstellen oder sicherzustellen, sonst werden sie nicht gleichzeitig verwendet, aber ich sehe es nicht explizit irgendwo erwähnt. Auf der anderen Seite gibt es Stücke wie * "Der Code muss in einem" statuslosen "Stil geschrieben sein [...] Artefakte dürfen nicht über die Lebensdauer der Anfrage hinausreichen" * in den FAQ. – zapl

Antwort

38

Kann AWS Lambda dasselbe Objekt gleichzeitig für verschiedene Aufrufe verwenden?

Können Instanzen von Handlern von AWS Lambda gemeinsame Heap (Speicher) teilen oder nicht?

Ein starkes, eindeutiges NO. Instanzen von Handlern von AWS Lambda können Dateien nicht einmal teilen (in /tmp).

Ein AWS Lambda Behälter für zwei oder mehr gleichzeitig existierende Anrufungen einer Lambda-Funktion nicht wiederverwendet werden können, da dies die Isolation Anforderung brechen würde:

Q: How does AWS Lambda isolate my code?

Jede AWS Lambda-Funktion läuft in seiner eigenen isolierten Umgebung, mit seinen eigenen Ressourcen und Dateisystem-Ansicht.

Der Abschnitt "Wie AWS Lambda Run My-Code funktioniert das Container Modell?" in der offiziellen Beschreibung von how lambda functions work Staaten:

Nach einer Lambda-Funktion ausgeführt wird, hält AWS Lambda die Behälter seit einiger Zeit in Erwartung einer anderen Lambda-Funktion Aufruf. In der Tat, friert der Service, den Behälter nach einer Lambda-Funktion abgeschlossen ist, und taut den Behälter für die Wiederverwendung, wenn AWS Lambda wählt den Behälter wieder zu verwenden, wenn die Lambda-Funktion wieder aufgerufen wird. Dieser Behälter Wiederverwendung Ansatz hat folgende Auswirkungen:

  • Alle Erklärungen in Ihrem Funktionscode Lambda initialisiert bleibt, zusätzliche Optimierung bereitstellt, wenn die Funktion erneut aufgerufen wird. Zum Beispiel, wenn Ihre Lambda-Funktion eine Datenbank Verbindung herstellt, sondern die Verbindung von wiederherzustellen, wird die ursprüngliche Verbindung in nachfolgenden Aufrufen verwendet. Sie können eine Logik in Ihren Code hinzufügen, um zu prüfen, ob eine Verbindung bereits vorhanden ist, bevor Sie eine erstellen.

  • Jeder Behälter enthält einige Speicherplatz im Verzeichnis/tmp. Der Inhalt des Verzeichnisses verbleibt, wenn der Container eingefroren ist, und bietet einen temporären Cache , der für mehrere Aufrufe verwendet werden kann. Sie können zusätzlichen Code hinzufügen, um zu überprüfen, ob der Cache die Daten enthält, die Sie gespeichert haben.

  • Hintergrundprozesse oder Rückrufe durch Ihre Lambda-Funktion initiiert, die nicht abgeschlossen werden konnten, wenn die Funktion beendet Lebenslauf, wenn AWS Lambda die Behälter wieder zu verwenden wählt. Sie sollten alle Hintergrund Prozesse oder Rückrufe stellen Sie sicher (im Fall von Node.js) in Ihrem Code vor dem Code Exits abgeschlossen sind.

Wie Sie sehen können, gibt es absolut keine Warnung über Rennbedingungen zwischen mehreren gleichzeitigen Aufrufen einer Lambda-Funktion, wenn sie versuchen Vorteil Behälter Wiederverwendung zu nehmen. Die einzige Anmerkung ist "verlass dich nicht darauf!".

+0

Das ist die perfekte Antwort, vielen Dank – Andremoniy

+0

das Kopfgeld wird so schnell wie möglich vergeben SO erlaubt es (22 Stunden übrig) – Andremoniy