ejemplo - AWS lambda y concurrencia de Java
aws lambda ejemplo java (1)
¿Puede AWS lambda usar el mismo objeto al mismo tiempo para diferentes llamadas?
¿Pueden las instancias de los controladores de AWS lambda compartir un montón común (memoria) o no?
Un NO fuerte y definido Las instancias de los controladores de AWS Lambda ni siquiera pueden compartir archivos (en /tmp
).
Un contenedor AWS Lambda no puede reutilizarse para dos o más invocaciones simultáneas de una función Lambda, ya que eso rompería el requisito de aislamiento:
Cada función de AWS Lambda se ejecuta en su propio entorno aislado , con sus propios recursos y vista del sistema de archivos.
La sección "¿Cómo ejecuta AWS Lambda Mi código? El modelo de contenedor" en la descripción oficial de cómo funcionan las funciones de lambda :
Después de que se ejecuta una función Lambda, AWS Lambda mantiene el contenedor durante un tiempo anticipándose a otra invocación de función Lambda. En efecto, el servicio congela el contenedor después de que se completa una función Lambda y lo descongela para su reutilización, si AWS Lambda elige reutilizar el contenedor cuando se invoca nuevamente la función Lambda. Este enfoque de reutilización de contenedores tiene las siguientes implicaciones:
Cualquier declaración en su código de función Lambda permanece inicializada, proporcionando una optimización adicional cuando la función se invoca nuevamente. Por ejemplo, si su función Lambda establece una conexión de base de datos, en lugar de restablecer la conexión, la conexión original se utiliza en invocaciones posteriores. Puede agregar lógica en su código para verificar si ya existe una conexión antes de crear una.
Cada contenedor proporciona algo de espacio en disco en el directorio / tmp. El contenido del directorio permanece cuando el contenedor está congelado, proporcionando un caché transitorio que se puede usar para múltiples invocaciones. Puede agregar código adicional para verificar si la memoria caché tiene los datos que almacenó.
Los procesos en segundo plano o las devoluciones de llamada iniciadas por su función Lambda que no finalizaron cuando la función finalizó se reanudan si AWS Lambda elige reutilizar el contenedor. Debe asegurarse de que los procesos en segundo plano o las devoluciones de llamada (en el caso de Node.js) en su código estén completos antes de que el código finalice.
Como puede ver, no hay absolutamente ninguna advertencia acerca de las condiciones de carrera entre múltiples invocaciones simultáneas de una función Lambda cuando se intenta aprovechar la reutilización de contenedores. La única nota es "¡no confíes en ella!".
Se sabe que AWS lambda puede reutilizar objetos de controladores creados anteriormente, y realmente lo hace (consulte las FAQ ):
P: ¿Las instancias de la función de reutilización de AWS Lambda?
Para mejorar el rendimiento, AWS Lambda puede optar por conservar una instancia de su función y reutilizarla para atender una solicitud posterior, en lugar de crear una copia nueva. Su código no debe suponer que esto siempre sucederá.
La pregunta es sobre Java
concurrencia de Java
. Si tengo clase para controlador, diga:
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
entonces, ¿será seguro para hilos acceder y trabajar con la variable de objeto foo
aquí o no?
En otras palabras: ¿AWS lambda puede usar el mismo objeto al mismo tiempo para diferentes llamadas?
EDITAR Mi función se procesa en fuente basada en eventos, en particular, se invoca mediante el método API Gateway.
EDIT-2 Este tipo de pregunta se plantea cuando desea implementar algún tipo de grupo de conexión a recursos externos, por lo que quiero mantener la conexión con el recurso externo como variable de objeto. En realidad funciona como se desea, pero tengo miedo de los problemas de concurrencia.
EDIT-3 Más específicamente, me pregunto: ¿ pueden las instancias de controladores de AWS lambda compartir un montón común (memoria) o no ? Tengo que especificar este detalle adicional para evitar respuestas con una lista de cosas obvias y conocidas sobre objetos seguros para subprocesos de Java.