
Arranque en frío de Azure functions: Estrategías para entornos críticos
Azure Function es la conocida, multifacética y flexible opción serverless de Azure Cloud. Si aún no conoces el término serverless, es como poder tener la capacidad de llevar un pedacito de tu código (una función o método) y ejecutarlo en la nube, sin que tengas que preocuparte por administrar servidores, infraestructura o preocuparte por tener una “máquina” encendida. Solo te tienes que preocupar por pagar por el cómputo que se usa durante esa ejecución.
Azure Function se puede usar para construir APIs, automatizar tareas y procesar datos de forma asíncrona y reactiva.
Azure Function, como toda solución serverless, tiene partidarios y detractores. Los detractores principalmente se basan en que es una opción de doble filo, esto por todos los casos que se vienen escuchando de startups que aplicaron serverless y que, a fin de mes, recibieron una factura que los puso de cabeza o que, en el mejor de los casos, no esperaban.
La verdad es que Azure Function, como toda tecnología, es una alternativa más, y los equipos deben evaluar la factibilidad para su respectivo caso de uso, así como tomar en cuenta todas las consideraciones para no tener sorpresas a fin de mes. Personalmente, veo Azure Function como una gran alternativa para automatización, procesos asíncronos/reactivos y tal vez APIs internas, más no para APIs públicas, por toda la puesta en escena y control que esto demanda para que no se te escape de las manos.
Dejando de lado el tema de los costos, si en alguna de tus soluciones ya estás usando Azure Function, es muy probable que te hayas percatado o estés sufriendo de una problemática que afecta a la mayoría de alternativas serverless: el llamado arranque en frío o cold start. Traducido, este término se refiere al tiempo de inicialización (provisión + carga del runtime + inicio de dependencias). Dependiendo de tu implementación, puede ir de unos cientos de milisegundos e incluso a segundos. Puede que para tu caso de uso esto no sea representativo, pero sí es importante para procesos críticos como banca, pagos, e-commerce, entre otros.
A continuación describo algunas alternativas para optimizar azure function y mejorar el arranque en frío no solo de código sino también relacionados con la configuration de infra en Azure:
- Elige el plan correcto de acuerdo a tu necesidad. Los planes Premium y Dedicated permiten la configuración “Always On”. Esto lo logran porque, por default, mantienen una instancia viva; por lo tanto, el cold start solo afectaría en el escalado de instancias nuevas. Por otro lado, ha salido un nuevo plan Consumption Flex que permite un concepto “Always Ready”, es decir, mantiene instancias listas para iniciarse, lo que no es lo mismo que instancias ya vivas. El plan de solo Consumption no tiene ninguna de estas ventajas.
- Ten en cuenta la plataforma o SO de tu stack. Por ejemplo, para .NET, las funciones suelen estar optimizadas para Windows de 64 bits y, por lo tanto, el arranque es mejor. Sin embargo, otros stacks como Node.js arrancan mejor en Linux. Esto se cruza con el plan, ya que los planes Consumption, por default, trabajan con Linux containers. Los planes Premium y Dedicated permiten elegir el SO.
- Ten en cuenta tú mismo stack. .NET y Node.js suelen tener un mejor tiempo de arranque, a diferencia de Java y Python en Azure.
- Mantén tu código ligero. Optimiza/divide funciones, usa la menor cantidad posible de dependencias tanto en capas de código como en el uso de librerías. En .NET, por ejemplo, puedes usar “Lazy Loading”.
- Optimiza networking y secretos. Para inyectar secretos, es mejor usar Azure App Configuration que Key Vault (esto dependerá de tu postura de seguridad). Para conexión a base de datos, inyecta con Lazy para que no se inicialice en el arranque.
- Dependiendo de tu propio caso de uso, considera usar la técnica “Pre-warming”. Básicamente, consiste en implementar un Function Trigger tipo timer que esté golpeando tu Function que quieres mantener “caliente”. En el plan Premium, esto se logra con instancias vivas.
No olvides monitorear siempre el comportamiento de tu componente función; esto puedes lograrlo con Azure Application Insights.
Dejo un repo de ejemplo con .NET 9 y HttpTrigger, está optimizado en el uso de paquetes y utiliza Lazy Loading de dependencias.
.NET Azure Function HttpTrigger :)
Conclusión
Azure Function es un gran componente y alternativa para arquitecturas que quieren adoptar serverless, pero debes estar consciente de las optimizaciones que debes hacer para que todo vaya mejor.
Sígueme en Linkedin para estar al tanto de mis publicaciones y novedades