He pensado que era un buen momento para hablar sobre cómo optimizar el uso que hacemos de nuestros roles en Azure, de tal modo que exprimamos al máximo cada máquina. Esto es siempre bueno tenerlo en mente, pero ahora que Microsoft nos ha cambiado a los suscriptores de MSDN y a los que disfrutamos de Bizspark la forma en que se limitan los beneficios de Azure que tenemos disponibles, puede ser un gran momento para revisarlo.
En nuestro caso, y sin entrar muy en detalle en cuanto a la arquitectura, tenemos un proceso que gestiona las llamadas al servicio, y 9 pequeños procesos que hacen tareas en background. Esto usando las plantillas básicas serían 10 roles, con 2 instancias por role para prevenir caídas, lo que serían 20 instancias muy desaprovechadas. ¡Una locura!
En su momento nos planteamos cómo diseñar la arquitectura de tal modo que aprovechásemos al máximo los recursos gratuitos que teníamos, y que además en un momento dado tuviésemos la versatilidad de cambiar rápidamente. Obviamente, la solución pasa por implementar en el arranque del web role que responde las llamadas al servicio un proceso que arranque hilos con los procesos en background que heredan de RoleEntryPoint. Tan sólo hay que asegurarse de llamar a todos los OnStart de los procesos de background, y luego hacer el new Thread sobre el método Run… ¡fácil fácil!
Hacerlo de este modo, aunque no sea lo más óptimo en cuanto a independencia de procesos, nos permite aprovechar al máximo todo y tener tanto los procesos de background como el frontend en una sola máquina (bueno, en dos) pero manteniendo la capacidad de levantar fácilmente más “instancias” (en nuestro caso hilos) de un proceso de background, o en caso de que uno empiece a consumir muchos recursos, separarlo a instancias independientes en unos minutos. Con nuestras pruebas iniciales de carga, aún teniendo esos 10 hilos en cada máquina, con nuestras dos instancias pequeñas podemos soportar 10.000 usuarios, y mantenemos la capacidad de crecer y optimizar de una manera muy sencilla.
¿Y vosotros? ¿Qué hacéis para reducir la factura de Azure?