Idempotencia
Las funciones duraderas proporcionan una idempotencia integrada para los inicios de la ejecución a través de los nombres de ejecución. Cuando proporciona un nombre de ejecución, Lambda lo usa para evitar ejecuciones duplicadas y habilitar reintentos seguros de las solicitudes de invocación. De forma predeterminada, los pasos tienen una semántica de ejecución de como mínimo una vez: durante la reproducción, el SDK devuelve los resultados comprobados sin volver a ejecutar los pasos completados, pero su lógica empresarial debe ser idempotente para gestionar los posibles reintentos antes de que se completen.
nota
Las asignaciones de orígenes de eventos (ESM) de Lambda no admiten la idempotencia en el momento del lanzamiento. Por lo tanto, cada invocación (incluidos los reintentos) inicia una nueva ejecución duradera. Para garantizar una ejecución idempotente con asignaciones de orígenes de eventos, implemente la lógica de idempotencia en el código de su función, como con Powertools para AWS Lambda o utilice una función de Lambda normal como proxy (despachador) para invocar una función duradera con una clave de idempotencia (parámetro del nombre de la ejecución).
Nombres de ejecución
Puede proporcionar un nombre de ejecución cuando invoca una función duradera. El nombre de la ejecución actúa como clave de idempotencia, lo que permite reintentar las solicitudes de invocación de forma segura sin crear ejecuciones duplicadas. Si no proporciona un nombre, Lambda genera automáticamente un identificador de ejecución único.
Los nombres de ejecución deben ser únicos dentro de su cuenta y región. Cuando invoca una función con un nombre de ejecución que ya existe, el comportamiento de Lambda depende del estado de la ejecución existente y de si la carga útil coincide.
Comportamiento de idempotencia
En la siguiente tabla, se describe cómo Lambda gestiona las solicitudes de invocación en función de si proporciona un nombre de ejecución, el estado de ejecución existente y si la carga útil coincide:
| Escenario | ¿Se proporcionó un nombre? | Estado de ejecución existente | ¿Carga útil idéntica? | Comportamiento |
|---|---|---|---|---|
| 1 | No | N/A | N/A | Nueva ejecución iniciada: Lambda genera un identificador de ejecución único e inicia una nueva ejecución. |
| 2 | Sí | Nunca existió o la retención caducó. | N/A | Nueva ejecución iniciada: Lambda inicia una nueva ejecución con el nombre proporcionado. |
| 3 | Sí | Ejecutar | Sí | Inicio idempotente: Lambda devuelve la información de ejecución existente sin iniciar un duplicado. En el caso de las invocaciones sincrónicas, esto actúa como una reconexión a la ejecución en ejecución. |
| 4 | Sí | Ejecutar | No | Error: Lambda devuelve un error de DurableExecutionAlreadyExists porque ya se está ejecutando una ejecución con este nombre con una carga útil diferente. |
| 5 | Sí | Cerrado (satisfactorio, fallido, detenido o agotado el tiempo de espera) | Sí | Inicio idempotente: Lambda devuelve la información de ejecución existente sin iniciar una nueva ejecución. Se devuelve el resultado de la ejecución cerrada. |
| 6 | Sí | Cerrado (satisfactorio, fallido, detenido o agotado el tiempo de espera) | No | Error: Lambda devuelve un error de DurableExecutionAlreadyExists porque una ejecución con este nombre ya se completó con una carga útil diferente. |
Nota
Los escenarios 3 y 5 demuestran un comportamiento idempotente en el que Lambda gestiona de forma segura las solicitudes de invocación duplicadas al devolver la información de ejecución existente en lugar de crear duplicados.
Idempotencia escalonada
De forma predeterminada, los pasos tienen una semántica de ejecución de como mínimo una vez. Cuando la función se reproduce tras una espera, una devolución de llamada o un error, el SDK compara cada paso con el registro de los puntos de control. En el caso de los pasos que ya se hayan completado, el SDK devuelve el resultado del punto de control sin volver a ejecutar la lógica escalonada. Sin embargo, si un paso falla o la función se interrumpe antes de que se complete, es posible que el paso se ejecute varias veces.
Su lógica empresarial, encapsulada en pasos, debe ser idempotente para gestionar posibles reintentos. Utilice claves de idempotencia para asegurarse de que las operaciones como los pagos o la escritura de bases de datos se ejecuten solo una vez, incluso si se reintenta el paso.
Ejemplo: uso de claves de idempotencia por pasos
Puede configurar los pasos para utilizar la semántica de ejecución de como máximo una vez si configura el modo de ejecución en AT_MOST_ONCE_PER_RETRY. Esto garantiza que el paso se ejecute como máximo una vez por reintento, pero es posible que no se ejecute en absoluto si la función se interrumpe antes de que se complete el paso.
El SDK impone la reproducción determinista porque valida que los nombres y el orden de los pasos coincidan con el registro de los puntos de control durante la reproducción. Si el código intenta ejecutar los pasos en un orden diferente o con nombres diferentes, el SDK lanza un NonDeterministicExecutionError.
Cómo funciona la reproducción con los pasos completados:
Primera invocación: la función ejecuta el paso A, crea un punto de control y, a continuación, espera.
Segunda invocación (después de la espera): la función se reproduce desde el principio, el paso A devuelve el resultado del punto de control al instante sin volver a ejecutarse y, a continuación, continúa con el paso B.
Tercera invocación (después de la espera): la función se reproduce desde el principio, los pasos A y B devuelven los resultados de los puntos de control al instante y, a continuación, continúa con el paso C.
Este mecanismo de reproducción garantiza que los pasos completados no vuelvan a ejecutarse, pero su lógica empresarial debe seguir siendo idempotente para gestionar los reintentos antes de completarlos.