Behebung von Problemen mit der Zuordnung von Ereignisquellen in Lambda
Probleme in Lambda, die sich auf die Zuordnung von Ereignisquellen beziehen, können komplexer sein, da sie das Debuggen mehrerer Services beinhalten. Darüber hinaus kann das Verhalten der Ereignisquelle je nach der verwendeten Ereignisquelle unterschiedlich sein. In diesem Abschnitt werden häufig auftretende Probleme im Zusammenhang mit der Zuordnung von Ereignisquellen aufgeführt und Hinweise zu deren Identifizierung und Behebung gegeben.
Anmerkung
In diesem Abschnitt wird zur Veranschaulichung eine Amazon-SQS-Ereignisquelle verwendet, aber die Prinzipien gelten auch für andere Zuordnungen von Ereignisquellen, die Nachrichten für Lambda-Funktionen in die Warteschlange stellen.
Drosselung erkennen und verwalten
In Lambda erfolgt die Drosselung, wenn das Gleichzeitigkeitslimit Ihrer Funktion oder Ihres Kontos erreicht ist. Betrachten Sie das folgende Beispiel, in dem es eine Lambda-Funktion gibt, um Nachrichten aus einer Amazon-SQS-Warteschlange zu lesen. Diese Lambda-Funktion simuliert 30-Sekunden-Aufrufe und hat eine Batchgröße von 1. Das bedeutet, dass die Funktion alle 30 Sekunden nur eine Nachricht verarbeitet:
const doWork = (ms) => new Promise(resolve => setTimeout(resolve, ms))
exports.handler = async (event) => {
await doWork(30000)
}
Bei einer so langen Aufrufzeit kommen Nachrichten schneller in der Warteschlange an als sie verarbeitet werden. Wenn die nicht reservierte Gleichzeitigkeit Ihres Kontos 100 beträgt, skaliert Lambda auf 100 gleichzeitige Ausführungen hoch, und dann erfolgt eine Drosselung. Sie können dieses Muster in den CloudWatch-Metriken für die Funktion sehen:
Die CloudWatch-Metriken für die Funktion zeigen keine Fehler, aber das Diagramm Gleichzeitige Ausführungen zeigt, dass die maximale Gleichzeitigkeit von 100 erreicht ist. Aus diesem Grund zeigt das Diagramm Drosselungen, dass die Drosselung bereits besteht.
Sie können Drosselungen mit CloudWatch-Alarmen erkennen und einen Alarm einstellen, sobald die Drosselungsmetrik für eine Funktion größer als 0 ist. Nachdem Sie das Drosselungsproblem identifiziert haben, stehen Ihnen einige Lösungsmöglichkeiten zur Verfügung:
-
Beantragen Sie eine Erhöhung der Gleichzeitigkeit von AWS-Support in dieser Region.
-
Identifizieren Sie Leistungsprobleme in der Funktion, um die Verarbeitungsgeschwindigkeit und damit den Durchsatz zu verbessern.
-
Erhöhen Sie die Batchgröße der Funktion, sodass bei jedem Aufruf mehr Nachrichten verarbeitet werden.
Fehler in der Verarbeitungsfunktion
Wenn die Verarbeitungsfunktion Fehler ausgibt, gibt Lambda die Nachrichten an die SQS-Warteschlange zurück. Lambda verhindert, dass Ihre Funktion skaliert wird, um Skalierungsfehler zu vermeiden. Die folgenden SQS-Metriken in CloudWatch weisen auf ein Problem mit der Warteschlangenverarbeitung hin:
Insbesondere nehmen sowohl das Alter der ältesten Nachricht als auch die Anzahl der sichtbaren Nachrichten zu, während keine Nachrichten gelöscht werden. Die Warteschlange wächst weiter, aber Nachrichten werden nicht verarbeitet. Die CloudWatch-Metriken für die verarbeitende Lambda-Funktion zeigen ebenfalls, dass ein Problem vorliegt:
Die Metrik für die Anzahl der Fehler ist ungleich Null und nimmt weiter zu, während die Anzahl der gleichzeitigen Ausführungen zurückgegangen ist und die Drosselung eingestellt wurde. Dies deutet darauf hin, dass Lambda die Hochskalierung Ihrer Funktion aufgrund von Fehlern eingestellt hat. Die CloudWatch Logs für die Funktion enthalten Details zur Art des Fehlers.
Sie können dieses Problem lösen, indem Sie die Funktion identifizieren, die den Fehler verursacht hat und dann den Fehler finden und beheben. Nachdem Sie den Fehler behoben und den neuen Funktionscode bereitgestellt haben, sollten die CloudWatch-Metriken die Wiederherstellung der Verarbeitung zeigen:
Hier sinkt die Metrik Anzahl der Fehler auf Null und die Metrik Erfolgsquote kehrt auf 100 % zurück. Lambda beginnt erneut mit der Hochskalierung der Funktion, wie im Diagramm Gleichzeitige Ausführungen dargestellt.
Identifizierung und Behandlung von Gegendruck
Wenn ein Ereignisproduzent konsistent Nachrichten für eine SQS-Warteschlange schneller generiert, als eine Lambda-Funktion diese verarbeiten kann, entsteht Gegendruck. In diesem Fall sollte die SQS-Überwachung das Alter der ältesten Nachricht linear ansteigen lassen, zusammen mit der ungefähren Anzahl der sichtbaren Nachrichten. Mithilfe von CloudWatch-Alarmen können Sie Gegendruck in Warteschlangen erkennen.
Die Schritte zur Behebung von Gegendruck hängen von Ihrem Workload ab. Wenn das Hauptziel darin besteht, die Verarbeitungskapazität und den Durchsatz durch die Lambda-Funktion zu erhöhen, haben Sie einige Möglichkeiten:
-
Beantragen Sie bei AWS-Support eine Erhöhung der Gleichzeitigkeit in der betreffenden Region.
-
Erhöhen Sie die Batchgröße der Funktion, sodass bei jedem Aufruf mehr Nachrichten verarbeitet werden.