Saltar al contenido

Cómo mantener caliente la cantidad deseada de contenedores de funciones de AWS Lambda

Esta es el arreglo más correcta que te podemos aportar, sin embargo obsérvala pausadamente y analiza si se puede adaptar a tu trabajo.

Solución:

Esto puede ser largo, pero tengan paciencia conmigo, ya que esto probablemente les daría una solución y podría ayudarlos a comprender mejor. ¿Cómo funciona Lambda?

Alternativamente puedes Saltar al finalLa solución” si no te interesa leer.

Para las personas que no están al tanto de los arranques en frío, lea esta publicación de blog para comprenderlo mejor. Para describir esto en breve:

Arranques en frío

  • Cuando se ejecuta una función por primera vez o después de actualizar el código de funciones o la configuración de recursos, se activará un contenedor para ejecutar esta función. Todo el código y las bibliotecas se cargarán en el contenedor para que pueda ejecutarse. A continuación, se ejecutará el código, comenzando con el código de inicialización. El código de inicialización es el código escrito fuera del controlador. Este código solo se ejecuta cuando el contenedor se crea por primera vez. Finalmente, se ejecuta el controlador de Lambda. Este proceso de configuración es lo que se considera un arranque en frío.
  • Para el rendimiento, Lambda tiene la capacidad de reutilizar contenedores creados por invocaciones anteriores. Esto evitará la inicialización de un nuevo contenedor y la carga de código. Solo se ejecutará el código del controlador. Sin embargo, no puede depender de un contenedor de una invocación anterior para ser reutilizado. si no ha cambiado el código y no ha pasado demasiado tiempo, Lambda puede reutilizar el contenedor anterior.
  • Si cambia el código, la configuración de recursos o ha pasado algún tiempo desde la invocación anterior, se inicializará un nuevo contenedor y experimentará un inicio en frío.

Ahora considere estos escenarios para una mejor comprensión:

  • Considere que la función Lambda, en el ejemplo, se invoca por primera vez. Lambda creará un contenedor, cargará el código en el contenedor y ejecutará el código de inicialización. A continuación, se ejecutará el controlador de función. esta invocación habrá experimentado un comienzo en frío. Como se menciona en los comentarios, la función tarda 15 segundos en completarse. Después de un minuto, la función se invoca de nuevo. Lo más probable es que Lambda reutilice el contenedor de la invocación anterior. esta invocación no experimentará un arranque en frío.
  • Ahora considera el segundo escenario, donde la segunda invocación se ejecuta 5 segundos después de la primera invocación. Dado que la función anterior tarda 15 segundos en completarse y no ha terminado de ejecutarse, la nueva invocación tendrá que crear un nuevo contenedor para que se ejecute esta función. Por lo tanto esta invocación experimentará un comienzo en frío.

Ahora, para presentar la primera parte del problema que ha resuelto:

Con respecto a la prevención de arranques en frío, esta es una posibilidad, sin embargo, no está garantizada, la solución común solo mantendrá caliente un contenedor de la función Lambda. Para hacerlo, ejecutaría un evento de CloudWatch utilizando un evento de programación (expresión cron) que invocará su función Lambda cada dos minutos para mantenerlo activo.


La solución:

Para su caso de uso, su función Lambda será invocado con mucha frecuencia con un tasa de concurrencia muy alta. Para evitar tantos arranques en frío como sea posible, deberá mantener calientes tantos contenedores como espera que alcance su máxima concurrencia. Para hacer esto lo harás necesita invocar las funciones con un retraso para permitir que la concurrencia de esta función genere y alcance la cantidad deseada de ejecuciones simultáneas. Esto obligará a Lambda a aumentar la cantidad de contenedores que desee. Esto, como resultado, puede aumentar los costos y no garantizará que se eviten los arranques en frío.

Dicho esto, aquí hay un desglose de cómo puede mantener calientes varios contenedores para su función al mismo tiempo:

  • deberías tener un Regla de eventos de CloudWatch que se activa según una programación. Este cronograma puede ser una tasa fija o una expresión cron. por ejemplo, puede configurar esta regla para que se active cada 5 minutos. Vas a a continuación, especifique una función Lambda (función de controlador) como destino de esta regla.

  • Su Función Lambda del controlador será entonces invoque la función Lambda (función que desea mantener caliente) para tantos contenedores en ejecución simultáneos como desee.

Hay algunas cosas a considerar aquí:

  1. Tendrá que generar simultaneidad porque si la primera invocación finaliza antes de que comience otra invocación, entonces esta invocación puede reutilizar el contenedor de invocaciones anteriores y no crear uno nuevo. Para hacer esto, deberá agregar algún tipo de retraso en la función Lambda si la función del controlador invoca la función. Esto se puede hacer pasando una carga útil específica a la función con estas invocaciones. La función lambda que desea mantener caliente verificará si existe esta carga útil. Si lo hace, la función esperará (para generar invocaciones simultáneas), si no lo hace, la función puede ejecutarse como se esperaba.

  2. También deberá asegurarse de que no se limite la llamada a la API Invoke Lambda si la llama repetidamente. Su función Lambda debe escribirse para manejar esta limitación si ocurre y considere agregar un retraso entre las llamadas a la API para evitar la limitación.

Al final, esta solución puede reducir los arranques en frío, pero aumentará los costos y no garantizará que se produzcan, ya que son inevitables cuando se trabaja con Lambda. Si su aplicación necesita tiempos de respuesta más rápidos que los que ocurre con un arranque en frío de Lambda, lo haría. recomiendo considerar tener su servidor en una instancia EC2.

Estamos usando lambdas java (spring boot) y hemos llegado a una solución prácticamente idéntica a la respuesta anterior de Kush Vyas, que funciona muy bien.

Sin embargo, descubrimos durante las pruebas de carga que a menudo se producía una solicitud legítima del usuario durante el período en que se ejecutaba la “función del controlador”, lo que provocaba de nuevo el inevitable arranque en frío…

Entonces, ahora en nuestra “función de controlador”, tenemos nuestro número regular de X solicitudes de calentamiento concurrentes, sin embargo, cada quinta ejecución de la función llamamos a nuestro objetivo lambda 2 veces más. La teoría es que terminaremos con X+2 lambdas que se mantienen calientes, pero para 4 de cada 5 llamadas de calentamiento todavía habrá 2 lambdas redundantes que pueden atender las solicitudes de los usuarios.

Redujo nuestra cantidad de arranques en frío aún más (pero obviamente aún no completamente) y todavía estamos jugando con la simultaneidad/frecuencia de combinaciones de calentamiento/tiempo de sueño para encontrar la solución óptima para nosotros; es probable que estos valores siempre dependan de requisitos de carga para una situación específica.

Al final de todo puedes encontrar los comentarios de otros gestores de proyectos, tú asimismo tienes la opción de dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *