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.
Konfiguration der Steuerelemente zur Fehlerbehandlung für Kafka-Ereignisquellen
Sie können konfigurieren, wie Lambda Fehler und Wiederholungsversuche für Ihre Kafka-Ereignisquellenzuordnungen behandelt. Mithilfe dieser Konfigurationen können Sie steuern, wie Lambda fehlgeschlagene Datensätze verarbeitet und das Wiederholungsverhalten verwaltet.
Verfügbare Wiederholungskonfigurationen
Die folgenden Wiederholungskonfigurationen sind sowohl für Amazon MSK- als auch für selbstverwaltete Kafka-Ereignisquellen verfügbar:
-
Maximale Wiederholungsversuche — Die maximale Anzahl von Lambda-Wiederholungsversuchen, wenn Ihre Funktion einen Fehler zurückgibt. Dies zählt nicht den ersten Aufrufversuch. Die Standardeinstellung ist -1 (unendlich). Wenn Sie sowohl unendlich viele Wiederholungsversuche als auch ein Ziel für den Fall eines Fehlers konfigurieren, wendet Lambda automatisch maximal 10 Wiederholungsversuche an.
-
Maximales Datensatzalter — Das maximale Alter eines Datensatzes, den Lambda an Ihre Funktion sendet. Die Standardeinstellung ist -1 (unendlich).
-
Stapel bei Fehler aufteilen — Wenn Ihre Funktion einen Fehler zurückgibt, teilen Sie den Stapel in zwei kleinere Stapel auf und versuchen Sie es jeweils separat erneut. Dies hilft, problematische Datensätze zu isolieren.
-
Partielle Batch-Antwort — Erlauben Sie Ihrer Funktion, Informationen darüber zurückzugeben, welche Datensätze in einem Batch bei der Verarbeitung fehlgeschlagen sind, sodass Lambda nur die fehlgeschlagenen Datensätze erneut versuchen kann.
Konfiguration der Steuerelemente für die Fehlerbehandlung (Konsole)
Sie können das Wiederholungsverhalten beim Erstellen oder Aktualisieren einer Kafka-Ereignisquellenzuordnung in der Lambda-Konsole konfigurieren.
Um das Wiederholungsverhalten für eine Kafka-Ereignisquelle (Konsole) zu konfigurieren
-
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie Ihren Funktionsnamen.
-
Führen Sie eine der folgenden Aktionen aus:
-
Um einen neuen Kafka-Trigger hinzuzufügen, wählen Sie unter Funktionsübersicht die Option Trigger hinzufügen.
-
Um einen vorhandenen Kafka-Trigger zu ändern, wählen Sie den Trigger aus und klicken Sie dann auf Bearbeiten.
-
-
Wählen Sie unter Event-Poller-Konfiguration den Bereitstellungsmodus aus, um die Steuerelemente für die Fehlerbehandlung zu konfigurieren:
-
Geben Sie für Wiederholungsversuche die maximale Anzahl von Wiederholungsversuchen ein (0-10000 oder -1 für unendlich).
-
Geben Sie für Maximales Datensatzalter das Höchstalter in Sekunden ein (60-604800 oder -1 für unendlich).
-
Um die Stapelaufteilung zu aktivieren, wenn Fehler auftreten, wählen Sie Stapel bei Fehler aufteilen aus.
-
Um eine partielle Batch-Antwort zu aktivieren, wählen Sie ReportBatchItemFailures.
-
-
Wählen Sie Hinzufügen oder Speichern.
Konfiguration des Wiederholungsverhaltens (AWS CLI)
Verwenden Sie die folgenden AWS CLI Befehle, um das Wiederholungsverhalten für Ihre Kafka-Ereignisquellenzuordnungen zu konfigurieren.
Erstellen einer Ereignisquellenzuordnung mit Wiederholungskonfigurationen
Im folgenden Beispiel wird eine selbstverwaltete Kafka-Ereignisquellenzuordnung mit Steuerelementen zur Fehlerbehandlung erstellt:
aws lambda create-event-source-mapping \ --function-name my-kafka-function \ --topics my-kafka-topic \ --source-access-configuration Type=SASL_SCRAM_512_AUTH,URI=arn:aws:secretsmanager:us-east-1:111122223333:secret:MyBrokerSecretName \ --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \ --starting-position LATEST \ --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \ --maximum-retry-attempts 3 \ --maximum-record-age-in-seconds 3600 \ --bisect-batch-on-function-error \ --function-response-types "ReportBatchItemFailures"
Für Amazon MSK-Ereignisquellen:
aws lambda create-event-source-mapping \ --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \ --topics AWSMSKKafkaTopic \ --starting-position LATEST \ --function-name my-kafka-function \ --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]' \ --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \ --maximum-retry-attempts 3 \ --maximum-record-age-in-seconds 3600 \ --bisect-batch-on-function-error \ --function-response-types "ReportBatchItemFailures"
Wiederholungskonfigurationen werden aktualisiert
Verwenden Sie den update-event-source-mapping Befehl, um Wiederholungskonfigurationen für eine bestehende Ereignisquellenzuordnung zu ändern:
aws lambda update-event-source-mapping \ --uuid 12345678-1234-1234-1234-123456789012 \ --maximum-retry-attempts 5 \ --maximum-record-age-in-seconds 7200 \ --bisect-batch-on-function-error \ --function-response-types "ReportBatchItemFailures"
PartialBatchResponse
Die partielle Batch-Antwort, auch bekannt als ReportBatchItemFailures, ist eine wichtige Funktion für die Fehlerbehandlung in der Lambda-Integration mit Kafka-Quellen. Ohne diese Funktion führt ein Fehler in einem der Elemente in einem Batch dazu, dass alle Nachrichten in diesem Batch erneut verarbeitet werden. Wenn die partielle Batch-Antwort aktiviert und implementiert ist, gibt der Handler nur Identifikatoren für die fehlgeschlagenen Nachrichten zurück, sodass Lambda nur diese spezifischen Elemente erneut versuchen kann. Dies bietet eine bessere Kontrolle darüber, wie Stapel mit fehlerhaften Meldungen verarbeitet werden.
Verwenden Sie dieses JSON-Schema, um Batch-Fehler zu melden:
{ "batchItemFailures": [ { "itemIdentifier": { "partition": "topic-partition_number", "offset": 100 } }, ... ] }
Wichtig
Wenn Sie ein leeres gültiges JSON oder Null zurückgeben, betrachtet das Eventquellen-Mapping einen Batch als erfolgreich verarbeitet. Alle zurückgegebenen ungültigen Topic-Partition_Number oder Offsets, die im aufgerufenen Ereignis nicht vorhanden waren, werden als Fehler behandelt und der gesamte Batch wird erneut versucht.
Die folgenden Codebeispiele zeigen, wie eine teilweise Batch-Antwort für Lambda-Funktionen implementiert wird, die Ereignisse aus Kafka-Quellen empfangen. Die Funktion meldet die Batch-Elementfehler in der Antwort und signalisiert Lambda, diese Nachrichten später erneut zu versuchen.
Hier ist eine Python-Lambda-Handler-Implementierung, die diesen Ansatz zeigt:
import base64 from typing import Any, Dict, List def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, List[Dict[str, Dict[str, Any]]]]: failures: List[Dict[str, Dict[str, Any]]] = [] records_dict = event.get("records", {}) for topic_partition, records_list in records_dict.items(): for record in records_list: topic = record.get("topic") partition = record.get("partition") offset = record.get("offset") value_b64 = record.get("value") try: data = base64.b64decode(value_b64).decode("utf-8") process_message(data) except Exception as exc: print(f"Failed to process record topic={topic} partition={partition} offset={offset}: {exc}") item_identifier: Dict[str, Any] = { "partition": f"{topic}-{partition}", "offset": int(offset) if offset is not None else None, } failures.append({"itemIdentifier": item_identifier}) return {"batchItemFailures": failures} def process_message(data: str) -> None: # Your business logic for a single message pass
Hier ist eine Node.js Version:
const { Buffer } = require("buffer"); const handler = async (event) => { const failures = []; for (let topicPartition in event.records) { const records = event.records[topicPartition]; for (const record of records) { const topic = record.topic; const partition = record.partition; const offset = record.offset; const valueBase64 = record.value; const data = Buffer.from(valueBase64, "base64").toString("utf8"); try { await processMessage(data); } catch (error) { console.error("Failed to process record", { topic, partition, offset, error }); const itemIdentifier = { "partition": `${topic}-${partition}`, "offset": Number(offset), }; failures.push({ itemIdentifier }); } } } return { batchItemFailures: failures }; }; async function processMessage(payload) { // Your business logic for a single message } module.exports = { handler };
Hier ist eine Java-Version:
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.ArrayList; import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; public class KafkaBatchHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> { @SuppressWarnings("unchecked") @Override public Map<String, Object> handleRequest(Map<String, Object> event, Context context) { List<Map<String, Object>> failures = new ArrayList<>(); Map<String, List<Map<String, Object>>> records = (Map<String, List<Map<String, Object>>>) event.getOrDefault("records", Map.of()); for (Map.Entry<String, List<Map<String, Object>>> entry : records.entrySet()) { for (Map<String, Object> record : entry.getValue()) { String topic = (String) record.get("topic"); Object partition = record.get("partition"); Object offset = record.get("offset"); String valueBase64 = (String) record.get("value"); try { String data = new String(Base64.getDecoder().decode(valueBase64), "UTF-8"); processMessage(data); } catch (Exception e) { System.err.printf("Failed to process record topic=%s partition=%s offset=%s: %s%n", topic, partition, offset, e.getMessage()); Map<String, Object> itemIdentifier = new HashMap<>(); itemIdentifier.put("partition", topic + "-" + partition); itemIdentifier.put("offset", offset instanceof Number ? ((Number) offset).longValue() : null); Map<String, Object> failure = new HashMap<>(); failure.put("itemIdentifier", itemIdentifier); failures.add(failure); } } } Map<String, Object> response = new HashMap<>(); response.put("batchItemFailures", failures); return response; } private void processMessage(String data) { // Your business logic for a single message } }