Tengo una máquina de estado en AWS. Quiero limitar la concurrencia de una tarea (creada a través de lambda) para reducir el tráfico a una de mis API descendentes.
Puedo restringir la simultaneidad de lambda, pero la tarea falla con el error "Lambda.TooManyExecutions". ¿Puede alguien compartir un enfoque simple para limitar la concurrencia de una tarea lambda?
Gracias, Vinod.
Puede usar un estado de mapa para ejecutar estas tareas en paralelo y usar la configuración de simultaneidad máxima para reducir las ejecuciones excesivas de lambda.
El estado del mapa ("Tipo": "Mapa") se puede usar para ejecutar un conjunto de pasos para cada elemento de una matriz de entrada. Mientras que el estado Parallel ejecuta múltiples ramas de pasos usando la misma entrada, un estado Map ejecutará los mismos pasos para múltiples entradas de una matriz en la entrada de estado.
- MaxConcurrency (Opcional) El valor del campo MaxConcurrency es un número entero que proporciona un límite superior sobre cuántas invocaciones del iterador se pueden ejecutar en paralelo. Por ejemplo, un valor MaxConcurrency de 10 limitará su estado de mapa a 10 iteraciones simultáneas que se ejecutan a la vez.
Esto debería reducir la probabilidad de problemas. Dicho esto, aún se beneficiaría de agregar una declaración de reintento para estos casos. Aquí hay un ejemplo :
{ "Retry": [ { "ErrorEquals": ["Lambda.TooManyRequestsException", "Lambda.ServiceException"], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ] }Si desea controlar esta concurrencia en diferentes ejecuciones, deberá implementar algún tipo de control por separado. Una forma de preparar su máquina de estado para eso es solicitar los datos que necesita y luego usar una actividad para esperar una respuesta.
Puede usar la concurrencia lambda que mencionó, pero luego agregar una cláusula de reintento a su función de paso para que cuando alcance el límite de concurrencia, las funciones de paso administren el reintento de esa tarea que falló.
Hay un límite para el número de reintentos, pero puedes definirlo.
Alternativamente, si desea volver a intentarlo sin límite, puede usar catch para pasar a un estado de espera cuando se produzca esa concurrencia. También puede leer sobre la captura en el enlace de arriba. Aquí hay un documento de estado de espera.
https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html
Solo tiene que hacer la transición del estado de espera al estado de la tarea después de que complete su espera.