|
Nuestros clientes me dicen que les encanta AWS Lambda por muchas razones. Por el lado del desarrollo, aprecian el modelo de programación simple y la facilidad con la que sus funciones pueden hacer uso de otros servicios de AWS. Por el lado de las operaciones, se benefician de la capacidad de crear aplicaciones potentes que pueden responder rápidamente a los patrones de uso cambiantes.
Como sabrá si ya está utilizando Lambda, sus funciones se ejecutan dentro de un entorno de ejecución seguro y aislado. El ciclo de vida de cada entorno consta de tres fases principales: Init
, Invoke
y Shutdown
. Entre otras cosas, el Init
fase inicia el tiempo de ejecución de la función y ejecuta el código estático de la función. En muchos casos, estas operaciones se completan en milisegundos y no alargan la fase de forma apreciable. En el resto de casos, pueden llevar una cantidad de tiempo considerable, por varias razones. Primero, inicializar el tiempo de ejecución para algunos idiomas puede ser costoso. por ejemplo, el Init
fase para una función Lambda que utiliza uno de los tiempos de ejecución de Java junto con un marco como Bota de primavera, Quarkuso micronauta a veces puede tardar hasta diez segundos (esto incluye la inserción de dependencias, la compilación del código para la función y el análisis del componente classpath). En segundo lugar, el código estático podría descargar algunos modelos de aprendizaje automático, calcular previamente algunos datos de referencia o establecer conexiones de red con otros servicios de AWS.
Presentación de Lambda SnapStart
Con el fin de permitirle utilizar Lambda de aún más formas, hoy presentamos Lambda SnapStart.
Después de habilitar Lambda SnapStart para una función de Lambda en particular, la publicación de una nueva versión de la función desencadenará un proceso de optimización. El proceso inicia su función y la ejecuta a través de todo el Init
fase. Luego, toma una instantánea encriptada e inmutable de la memoria y el estado del disco, y la almacena en caché para su reutilización. Cuando la función se invoca posteriormente, el estado se recupera de la memoria caché en fragmentos según sea necesario y se utiliza para llenar el entorno de ejecución. Esta optimización hace que el tiempo de invocación sea más rápido y más predecible, ya que la creación de un nuevo entorno de ejecución ya no requiere un dedicado Init
fase.
Estamos lanzando con soporte para funciones de Java que hacen uso de Corretto (java11
) y espere ver que Lambda SnapStart se ponga en uso de inmediato para aplicaciones que utilizan Spring Boot, Quarkus, Micronaut y otros marcos de Java. Habilitar las funciones de Lambda SnapStart para Java puede hacer que se inicien hasta 10 veces más rápido, sin costo adicional.
Uso de Lambda SnapStart
Debido a que mi último encuentro real con Java tuvo lugar en el siglo pasado, utilicé el Ejemplo de Spring Boot 2 sin servidor desde el Laboratorios de AWS repositorio como punto de partida. Instalé la CLI de AWS SAM e hice una compilación e implementación de prueba para establecer una línea de base. Invoqué la función y vi que el duración inicial fue un poco más de 6 segundos:
Luego agregué dos líneas a template.yml
para configurar el SnapStart
propiedad:
Reconstruí y volví a implementar, publiqué una versión nueva de la función para configurar SnapStart y ejecuté otra prueba:
Con SnapStart, la fase de inicialización (representada por el duración inicial que les mostré antes) sucede cuando publico una nueva versión de la función. Cuando invoco una función que tiene habilitado SnapStart, Lambda restaura la instantánea (representada por la duración de la restauración) antes de invocar el controlador de función. Como resultado, la invocación en frío total con SnapStart ahora es Restaurar duración + Duración. SnapStart ha reducido la duración del arranque en frío de más de 6 segundos a menos de 200 ms.
Volverse resistente al chasquido
Lambda SnapStart acelera las aplicaciones al reutilizar una única instantánea inicializada para reanudar múltiples entornos de ejecución. Esto tiene algunas implicaciones interesantes para su código:
Unicidad – Al usar SnapStart, cualquier contenido único que solía generarse durante la inicialización ahora debe generarse después de la inicialización para mantener la exclusividad. Si usted (o una biblioteca a la que hace referencia) usa un generador de números pseudoaleatorios, no debe basarse en una semilla que se obtiene durante la fase de inicio. Hemos actualizado OpenSSL’s RAND_Bytes
para garantizar la aleatoriedad cuando se usa junto con SnapStart, y hemos verificado que java.security.SecureRandom
ya es resistente a las roturas. Amazon Linux /dev/random
y /dev/urandom
también son resistentes a las roturas.
Conexiones de red -Si su código crea conexiones a largo plazo a los servicios de red durante el Init
fase y los utiliza durante la Invoke
fase, asegúrese de que pueda restablecer la conexión si es necesario. Los SDK de AWS ya se han actualizado para hacer esto.
Datos efímeros – Esta es efectivamente una forma más general de los elementos anteriores. Si su código descarga o calcula información de referencia durante el Init
fase, considere realizar una verificación rápida para asegurarse de que no se haya vuelto obsoleto durante el período de almacenamiento en caché.
Lambda proporciona un par de enlaces de tiempo de ejecución para ayudarlo a mantener la exclusividad, así como una herramienta de análisis para ayudar a detectar posibles problemas.
Cosas que saber
Aquí hay un par de otras cosas que debe saber sobre Lambda SnapStart:
almacenamiento en caché – Las instantáneas en caché se eliminan después de 14 días de inactividad. Lambda actualizará automáticamente la memoria caché si una instantánea depende de un tiempo de ejecución que se actualizó o parchó.
Precios – No hay cargo adicional por el uso de Lambda SnapStart.
Compatibilidad de características – No puede usar Lambda SnapStart con almacenamiento efímero más grande, sistemas de archivos elásticos, simultaneidad aprovisionada o Graviton2. En general, recomendamos usar SnapStart para sus funciones de Lambda de propósito general y Concurrencia aprovisionada para el subconjunto de aquellas funciones que son excepcionalmente sensibles a la latencia.
Petardo – Esta característica hace uso de Instantánea de petardos.
Regiones – Lambda SnapStart está disponible en las regiones de EE. UU. Este (Ohio, N. Virginia), EE. UU. Oeste (Oregón), Asia Pacífico (Singapur, Sídney, Tokio) y Europa (Fráncfort, Irlanda, Estocolmo).
— jeff;