¿Cómo puedo reducir la latencia de inicialización y duración de la invocación de mi función de Java Lambda?
Mi función de Java AWS Lambda no funciona de manera óptima. ¿Por qué sucede esto y cómo puedo reducir la latencia de inicialización y duración de mi función de Java?
Descripción breve
Hay dos factores principales que pueden contribuir a la alta latencia de una función de Java Lambda:
Carga diferida de clases de máquina virtual de Java (JVM)
Para reducir el uso de memoria, la JVM retrasa la inicialización de una biblioteca de clases de Java hasta que se llame a la biblioteca por primera vez en una aplicación. Este retraso puede provocar una gran cantidad de operaciones de entrada y salida (E/S), lo que se traduce en latencias de mayor duración para las primeras invocaciones en un entorno de ejecución de Lambda.
La API de Java Reflection
La API de Java Reflection permite que el código Java descubra información sobre otras clases, interfaces, campos y métodos y, a continuación, opere con sus valores subyacentes. Dado que la reflexión implica tipos que se resuelven dinámicamente, no se pueden realizar determinadas optimizaciones de JVM. En consecuencia, las operaciones reflexivas tienen un rendimiento más lento que sus homólogas no reflectantes.
Para optimizar el rendimiento de la función de Java Lambda, puede implementar una o más de las prácticas recomendadas descritas en este artículo.
Nota: Para ver un estudio de caso específico, consulte AWS re:Invent 2019: Prácticas recomendadas para AWS Lambda y Java.
Resolución
Configure la concurrencia aprovisionada para su función de Lambda
La concurrencia aprovisionada inicializa una cantidad solicitada de entornos de ejecución para que estén preparados para responder inmediatamente a las invocaciones de la función. Para configurar la concurrencia aprovisionada para la función, siga las instrucciones que se indican en Configurar la concurrencia aprovisionada.
Para obtener más información, consulte Administrar la concurrencia de una función de Lambda.
**Nota:**La configuración de la concurrencia aprovisionada implica cargos en su cuenta de AWS. Puede configurar la concurrencia aprovisionada en una versión de una función o en un alias de función de Lambda.
Inicialice la lógica estática de su función fuera del controlador de funciones
Al inicializar una función de Lambda, Lambda asigna una ráfaga de capacidad de la CPU del host durante un máximo de 10 segundos. Debido a esta ráfaga de la CPU, se recomienda hacer lo siguiente fuera del controlador de funciones:
- Importar bibliotecas y dependencias
- Establecer configuración
- Inicializar conexiones a otros servicios
Esta inicialización estática permite que estos recursos se inicialicen una vez por entorno aislado y, a continuación, se reutilicen para todas las invocaciones futuras en el entorno de ejecución.
Para obtener más información, consulte Optimizar la inicialización estática.
Realice llamadas a la API a cualquier biblioteca cargada de forma diferida fuera del controlador de funciones
Para evitar la carga diferida de las bibliotecas durante la inicialización, puede realizar llamadas a la API ficticias a cualquier biblioteca cargada de forma diferida fuera del controlador de funciones. Estas llamadas ficticias inicializan las bibliotecas y precalientan el SDK que está utilizando.
Nota: Las llamadas ficticias a bibliotecas cargadas de forma diferida pueden fallar si Lambda no tiene la información necesaria para una llamada a la API correcta. Si la llamada falla, asegúrese de detectar el error.
Reduzca las operaciones reflectantes en su código de Lambda
Las operaciones reflectantes tienen un rendimiento más lento que sus homólogas no reflectantes. Evite las operaciones reflexivas en las secciones de código que se invocan con frecuencia.
Reduzca el número de clases en su aplicación
Reducir el tamaño del paquete de implementación a sus necesidades de versión ejecutable reduce la cantidad de tiempo que se tarda en invocar la función.
Para obtener más información, consulte Prácticas recomendadas para trabajar con funciones de AWS Lambda.
Establezca los parámetros de configuración de la función de Lambda por adelantado
Al configurar los parámetros de configuración de su función por adelantado, se reduce la latencia de invocación y duración de la función. Si no especifica variables de configuración en el código, Lambda tardará más tiempo en descubrir las variables predeterminadas de su función.
Para obtener más información, consulte la sección Código de función de las prácticas recomendadas para trabajar con las funciones de AWS Lambda.
Actualización a AWS Java SDK 2.0
Para obtener más información, consulte Ajustar el AWS Java SDK 2.x para reducir el tiempo de startup.
Nota: El AWS Java SDK 2.0 incluye el cliente HTTP Apache y el cliente HTTP Netty de forma predeterminada, junto con el cliente Java HTTP URL Connection. Se recomienda eliminar los clientes HTTP Apache y Netty del paquete de implementación si no son necesarios para su caso de uso.
Contenido relevante
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 6 meses
- OFICIAL DE AWSActualizada hace 2 años