Hoy quiero tocar el tema de CDN específicamente Azure Content Delivery Network. Esta herramienta nos ofrece una solución global para tener contenido disponible usando un ancho de banda de gran velocidad. En esta red podemos almacenar objetos en caches públicos tales como archivos, aplicaciones, máquinas virtuales o cualquier objeto que pueda almacenarse en vía http o https.
El objetivo de esta publicación es tocar las posibles utilizaciones y alcance del manejo CDN para mejorar la performance y la escalabilidad en nuestras aplicaciones Asp.Net Core.
Este documento está dirigido a desarrolladores que quieren conocer Asp.Net core y el uso de Azure CDN o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.
Usualmente CDN lo utilizamos para entregar contenido estático, como imágenes, archivos javascript, archivos de estilos css, etc. Aunque en su gran mayoría se usa para esto también podemos utilizar para brindar contenido dinámico almacenando su parametrización y devolviendo el mismo resultado.
Una de las principales ventajas del uso es que posee una latencia muy pequeña lo cual hace que se pueda entregar contenido extremadamente rápido sin estar atado a una ubicación geográfica o bien brindando lo más cerca posible del usuario que la solicita.
Usar CDN no ayuda a reducir la carga de la aplicación ya que liberamos a los servidores de procesamiento innecesario al entregar el contenido. Esto aumenta el rendimiento y reduce el costo del consumo de red como también aumentando la disponibilidad.
Veamos algunos casos típicos donde podemos usar CDN:
- Recursos Estáticos: Nuestros sitios web contienen una gran cantidad de contenidos estáticos como imágenes, hojas de estilo, documentos, archivos, páginas web completas o parciales o cualquier contenido que no necesita ser procesado por el servidor.
- Contenido Estático para dispositivos móviles: Por medio de servicio web se puede proporcionar datos estáticos a este tipo de clientes.
- Media y Video: Podemos transferir videos pequeños. El gran beneficio es que baja mucha la latencia y aumenta la disponibilidad de este tipo de contenido. Algo para tener en cuenta es que Azure Media Services puede ser integrado con Azure CDN para entregar contenido.
- Aumento de Demanda: podemos evitar que el aumentar la demanda no aumente nuestros costos de consumo. Por ejemplo, si nuestra aplicación lanza una nueva versión, aumentará la demanda de nuestros archivos y contenido para las nuevas características.
Ahora bien, qué debemos tener en cuenta para el uso o implementación:
- Debemos tenerlo en cuenta durante nuestro proceso de desarrollo e implementación de contenido estático y recursos de nuestras aplicaciones.
- Debemos considerar que nuestro contenido será actualizado, por esto, debe estar versionado.
- Es difícil realizar pruebas locales o probar aplicaciones locales.
- El contenido público es enviado desde dominios diferentes lo cual puede afectar a los resultados SEO.
- Podemos encontrarnos con entornos donde no podamos consumir recursos directamente desde el CDN. Para esto es necesario hacer una implementación especial.
- Si la red es privada, como una empresa, tal vez no sea una buena opción por restricciones de seguridad de la misma red.}
Usar CDN es una buena práctica para minimizar la carga, maximizar la disponibilidad y rendimiento de nuestras aplicaciones. Es una buena práctica altamente recomendable para implementar en nuestras aplicaciones web. Veamos algunas estrategias:
Entrega
- CDN solamente necesita un endpoint HTTP o HTTPS la cual será utilizada para acceder y para almacenar el contenido.
- Debemos recordar que el Blob al cual esté direccionado debe ser público.
- Si nuestro lo seteamos como root en una WebApp todo el sitio quedará disponible por CDN.
- Cuando las fuentes son dinámicas, podemos utilizar parámetros vía QueryString como llaves para almacenar en caché el contenido de este tipo.
- Debemos recordar que los recursos del tipo blobs son sensibles a mayúsculas y minúsculas.
Despliegue
- El contenido puede necesitar ser desplegado inmediatamente. Debemos considerar que será necesario un mecanismo de control de versiones para poder entregar las el contenido correctamente.
- La comprensión, unión y minificación de archivos son técnicas utilizadas para reducir el tiempo de carga de los clientes y son compatibles con CDN.
- Al utilizar la compresión de contenido será enviado en un formato zip o gzip. Por default Azure comprimira el contenido si el procesador se encuentra a menos de un 50% de consumo.
Enrutamiento y control de versiones
- Si necesitamos mantener control de versiones podemos crear un nuevo CDN y conservar el antiguo para versiones anteriores de nuestra aplicación.
- La implementación de nuevas versiones de contenido estático será necesario tener en cuenta si fueron almacenados en el caché del CDN.
- Podemos restringir el acceso por país. Azure CDN nos permite filtrar contenido por origen de la petición y restringir la entrega del contenido.
Control de Caché
- Debemos considerar el almacenamiento del caché en el sistema. Podemos configurar propiedades de caché desde el CDN y para el cliente podemos configurar los encabezados HTTP.
- Podemos purgar el caché eliminandolos manualmente, convertir el blob en privado. Debemos tener en cuenta que los archivos solo serán eliminados cuando el tiempo de vida expire realmente si no se especifica un tiempo de cache.
- En las aplicaciones web podemos establecer el almacenamiento de caché y su caducidad mediante el elemento clientCache del namespace system.webServer / staticContent en el archivo web.config.
- Si el contenido es dinámico no debemos olvidar setear la propiedad Cache.SetExpires en cada página.
Seguridad
- En el CDN puede entregar contenido a través de HTTPS utilizando certificados proporcionados por el mismo. También estará disponible en HTTP ya que no es posible bloquear los elementos por este canal.
- Podemos tener algunos inconvenientes al usar peticiones AJAX debido a que se hace uso del objeto XMLHttpRequest cuando son solicitados datos, imágenes o fuentes de un dominio diferente. La gran mayoría de los navegadores evitan el consumo de objetos cruzados (CORS) si el servidor no está configurado correctamente.
Dominios personalizados
- Podemos usar dominios personalizados y utilizarlo para acceder a recursos a través de CDN.
- Podemos utilizar subdominios utilizando registros CNAME en nuestros CDN. Recordemos que si usamos este método no podremos usar SSL ya que el CDN utiliza sus propios certificados.
Tips para SEO
- Debemos incluir el encabezado REL en cada una de las páginas o los recursos.
- Utilizar un subdominio CNAME para acceder a los recursos.}
- Tener en cuenta que la dirección IP del CDN puede ser diferente del país donde se encuentra su aplicación.
- Mantener la misma estructura si estamos usando almacenamiento Blob Azure
Supervisión y registro
Debemos agregar en nuestra estrategia de construcción de aplicaciones el planeamiento para implementación de CDN para poder detectar y medir fallas o problemas de latencia. Desde el portal de Azure podemos encontrar un panel de administración.
Demos Considerar:
- Ancho de banda
- Datos transferidos
- Hits
- Estado del caché
- Cache Hit ratio
- Solicitudes desde IPV4 / 6
Costos
Algo para tener muy presente es que se cobra por transferencia de información saliente desde nuestro endpoint CDN. Debemos incluir el costo de almacenamiento de recursos que se alojan activamente y sus transacciones. Debemos balancear los tiempos de expiración de caché, no debe ser muy largos para mantener un caché actualizado como no deben ser muy cortos para aumentar los costos.
Agrupamiento y minificación
Una excelente práctica es la agrupación y la minificación de recursos. Esta práctica reduce notoriamente los tiempos de descarga debido a su reducción en tamaño.
Tenemos varias formas de manejar este tipo de prácticas. Podemos hacerlo desde .Net MVC como también con algunas herramientas de NodeJS. Mi recomendación es ver WebPack, una herramienta muy popular dedicada a este tipo de funciones.
Conclusión
CDN posee un gran soporte para la utilización de caché tanto en entrega de contenido estático o contenido dinámico. Podemos aprovechar esta funcionalidad para aumentar el rendimiento y la escalabilidad de nuestras aplicaciones. En futuros artículos veremos cómo usar Azure CDN.