¿Cómo puedo hacer que mi función de Lambda sea idempotente?

4 minutos de lectura
0

Quiero hacer que el código de mi función de AWS Lambda sea idempotente para evitar incoherencias y pérdidas de datos en mi aplicación.

Breve descripción

En programación, la idempotencia se refiere a la capacidad de una aplicación o componente para identificar eventos repetidos y evitar la duplicación, la incoherencia o la pérdida de datos. Para que la función de AWS Lambda sea idempotente, es necesario diseñar la lógica de la función de modo que trate correctamente los eventos duplicados.

La lógica de funciones idempotentes puede ayudar a reducir los siguientes problemas:

  • Llamadas a la API innecesarias
  • Tiempo de procesamiento de código
  • Incoherencia de datos
  • Limitaciones
  • Latencia

Solución

Para que la función sea idempotente, el código de la función debe validar correctamente los eventos de entrada e identificar si se han procesado anteriormente. La funcionalidad de la aplicación dicta la mejor manera de escribir el código.

Utilice el siguiente ejemplo de lógica de funciones y recomendaciones como guía.

Ejemplo de lógica de función de Lambda idempotente

Nota: El siguiente ejemplo de lógica de función de Lambda es aplicable en la mayoría de los casos prácticos.

1.    Extraiga el valor de un atributo único del evento de entrada (por ejemplo, un identificador de transacción o compra).

2.    Compruebe si el valor del atributo existe en una base de datos de control (por ejemplo, una tabla de Amazon DynamoDB).

3.    En función de los resultados, complete el siguiente paso:
Si existe un valor único, finalice la acción sin que se produzca ningún error.

\Alternativa:

Si no existe un valor único, continúe con la acción que diseñó originalmente.

Nota: Añadir servicios de AWS a su arquitectura puede conllevar costes adicionales. Para obtener más información, consulte Precios de Amazon DynamoDB y Precios de AWS.

4.    Si el valor único no existe una vez finalizado el trabajo de la función, incluya el registro en la base de datos de control.

5.    Finalice la acción.
Nota: Si usa versiones ejecutables de Java o Python para su función, consulte los módulos de idempotencia de Python y Java en la página Powertools for AWS Lambda de GitHub.

Recomendaciones relacionadas con la idempotencia de las funciones de Lambda

  • Planifique las características de idempotencia antes de desarrollar la aplicación.
  • Cuando el código de Lambda procese un evento duplicado, asegúrese de que finalice sin que se produzca ningún error.
    Nota: La aparición de errores puede provocar más reintentos, ya sea por parte de Lambda o de otro servicio que invoque su función.
  • Cambie la configuración del tiempo de espera de la función de Lambda para que toda la versión ejecutable se trate correctamente.
    Nota: El uso de un servicio independiente para conservar los datos y controlar los eventos duplicados puede requerir llamadas de la API a los puntos de enlace HTTPS. Por lo tanto, las llamadas de la API a los puntos de enlace HTTPS pueden requerir que la versión ejecutable dure más de los 3 segundos predeterminados.
  • Pruebe y optimice la función en la medida de lo posible. Simule una tasa de solicitudes y un escenario reales.
    Nota: Es fundamental probar y optimizar la lógica de las funciones idempotentes para poder prevenir posibles efectos secundarios, como tiempos de espera, latencia excesiva o cuellos de botella.
  • Almacene los datos de la sesión mediante un servicio que sea fácilmente escalable y que proporcione un alto rendimiento, como DynamoDB.

Nota: Al realizar llamadas de la API a Amazon Elastic Compute Cloud (Amazon EC2), el servicio ofrece el parámetro clientToken. Este parámetro garantiza que una solicitud de la API mutante complete correctamente su flujo de trabajo solo una vez, aunque inicie varios reintentos con el mismo clientToken.


Información relacionada

Lambda programming model

Create a Lambda function with the console

Making retries safe with idempotent APIs

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años