Al consumir y procesar datos de streaming desde un origen de eventos, de forma predeterminada, Lambda comprueba hasta el número de secuencia más alto de un lote solo cuando el lote se ha completado con éxito. Lambda trata todos los demás resultados como un error completo y vuelve a intentar procesar el lote hasta el límite de reintentos. Para permitir éxitos parciales al procesar lotes de una secuencia, active ReportBatchItemFailures
. Permitir éxitos parciales puede ayudar a reducir el número de reintentos en un registro, aunque no impide por completo la posibilidad de reintentos en un registro exitoso.
Para activar ReportBatchItemFailures
, incluya el valor enumerado ReportBatchItemFailures
en la lista FunctionResponseTypes. Esta lista indica qué tipos de respuesta están habilitados para su función. Puede configurar esta lista al crear o actualizar una asignación de orígenes de eventos.
Sintaxis del informe
Al configurar los informes sobre errores de elementos por lotes, la clase StreamsEventResponse
se devuelve con una lista de errores de elementos de lote. Puede utilizar un objeto StreamsEventResponse
para devolver el número de secuencia del primer registro fallido del lote. También puede crear su propia clase personalizada usando la sintaxis de respuesta correcta. La siguiente estructura JSON muestra la sintaxis de respuesta requerida:
{
"batchItemFailures": [
{
"itemIdentifier": "<SequenceNumber>"
}
]
}
nota
Si la matriz batchItemFailures
contiene varios elementos, Lambda usa el registro con el número de secuencia más bajo como punto de control. Luego Lambda vuelve a probar todos los registros a partir de ese punto de control.
Condiciones de éxito y fracaso
Lambda trata un lote como un éxito completo si devuelve cualquiera de los siguientes elementos:
-
Una lista
batchItemFailure
vacía -
Una lista
batchItemFailure
nula -
Una
EventResponse
vacía -
Un
EventResponse
nulo
Lambda trata un lote como un error completo si devuelve cualquiera de los siguientes elementos:
-
Una cadena
itemIdentifier
vacía -
Una
itemIdentifier
nula -
Un
itemIdentifier
con un mal nombre de clave
Lambda reintentos fallidos basados en su estrategia de reintento.
Bisecar un lote
Si su invocación falla y BisectBatchOnFunctionError
está activada, el lote se divide en bisectos independientemente de su configuración ReportBatchItemFailures
.
Cuando se recibe una respuesta de éxito parcial de lote y se activan tanto BisectBatchOnFunctionError
como ReportBatchItemFailures
, el lote se divide en el número de secuencia devuelto y Lambda vuelve a intentar solo los registros restantes.
Estos son algunos ejemplos de código de función que devuelven la lista de IDs de mensajes fallidos del lote:
- SDK para .NET
-
nota
Hay más información en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos sin servidor
. Notificación de los errores de los elementos del lote de DynamoDB con Lambda mediante .NET.
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using System.Text.Json; using System.Text; using Amazon.Lambda.Core; using Amazon.Lambda.DynamoDBEvents; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace AWSLambda_DDB; public class Function { public StreamsEventResponse FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context) { context.Logger.LogInformation($"Beginning to process {dynamoEvent.Records.Count} records..."); List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new List<StreamsEventResponse.BatchItemFailure>(); StreamsEventResponse streamsEventResponse = new StreamsEventResponse(); foreach (var record in dynamoEvent.Records) { try { var sequenceNumber = record.Dynamodb.SequenceNumber; context.Logger.LogInformation(sequenceNumber); } catch (Exception ex) { context.Logger.LogError(ex.Message); batchItemFailures.Add(new StreamsEventResponse.BatchItemFailure() { ItemIdentifier = record.Dynamodb.SequenceNumber }); } } if (batchItemFailures.Count > 0) { streamsEventResponse.BatchItemFailures = batchItemFailures; } context.Logger.LogInformation("Stream processing complete."); return streamsEventResponse; } }