Arquitectura Ganadora

En lagash hemos tenido el gran honor de haber recibo varios reconocimientos por distintos proyectos que desarrollamos dentro de la compañía. Como director de desarrollo de este gran equipo y directo involucrado en la calidad y arquitectura de nuestros proyectos, quiero compartirles la arquitectura de uno de estos sistemas.

Reconocimientos

A nivel Latinoamérica hemos ganado en las siguientes categorías:

  • Application Development
  • Mobile App development
  • Public Sector: Govermment

A nivel mundial hemos ganado en la siguiente categoría

  • Public Sector: Govermment

Estos reconocimientos reflejan todo el esfuerzo volcado en nuestros proyectos, la pasión que tenemos por en la tecnología y la inconstante búsqueda de la excelencia.

Escenario:

Este sistema está enfocado a una aplicación para dispositivos móviles, la cual en función de la ubicación en donde se encuentra se visualizan puntos determinados en un radio configurado.

Para este análisis puntual no tiene importancia el significado funcional de dichos puntos.

Una de los principales atributos de calidad claves para este sistema, es la escalabilidad. El sistema será utilizado por un gran sector de la población, por lo que debe soportar un alto número de llamadas concurrentes. Por otro lado, los radios de consultas de dos usuarios distintos, pueden generar conjuntos de intersección en común en donde haya elementos en común entre la respuesta a un usuario y la respuesta a otro.

Arquitectura ganadora:

Componentes significativos de la arquitectura:

App en dispositivos móviles:

Sistema de punto de ingreso al usuario. Este componente se encuentra desarrollado con tecnología Xamarin, lo cual permite estar disponible de manera nativa para distintas plataformas, sin la necesidad de realizar desarrollos distintas para cada una.

Storage:

El componente de storage nos permite almacenar contenido de multimedia que es generado dentro de la app mobile. Un punto importante a comentar sobre el acceso a este componente es la posibilidad de que la app lo haga de manera directa para generar contenido en el storage, sin la necesidad de pasar por un servicio intermedio. Esto se puede hacer de manera segura, dado que el acceso se realiza mediante la utilización de un token temporal que permite la escritura específica de una uri. De esta manera, podemos escalar el uso de la plataforma, dado que no estamos limitando a que elw contenido deba pasar a través de servicios administrados por nosotros, generando una disminución en la transferencia de datos, delegando esta responsabilidad a un componente de Azure altamente escalable.

Service Api:

Ambiente altamente escalable para la ejecución de App services

Dentro de este ambiente se puede desplegar:

  • Windows web apps
  • Linux web apps (in Preview)
  • Docker containers (in Preview)
  • Mobile apps
  • Functions

Los ambientes de App Services (App Services Environments – ASE) son apropiados para soluciones que requieren:

  • Alta escalabilidad
  • Aislamiento y acceso seguro a redes.
  • Alto uso de memoria.

Redis:

Este componente permite tener una base de datos orientada a cache, mediante este mecanismo es posible tener un tiempo de respuesta optimo para las consultas con alta concurrencia. En el escenario de uso de este sistema la cantidad de colisiones de consultas de distintos usuarios con el mismo resultado es muy alta, dado que se devuelven puntos cercanos a una locación. Bajo este escenario es optima la utilización de cache. Por otro lado, no hay una alta actualización de datos; sin embargo están contemplados los procesos necesarios para realizar estas actualizaciones.

Cache API:

Servicio interno para interactuar con el cache, poder realizar las consultas y actualizar la información.

SQL Database:

Base de datos relación que da soporte a la información de toda la solución. Los datos que se pre calculan para insertar en el cache son obtenidos directamente de la base de datos de SQL y procesados para el cache.

Topic Service Bus:

Este componente nos permite generar eventos hacia otros sistemas, que sean consumidos mediante el patrón de Topics de Service Bus. Existen distintos topics para comunicar distintos tipo de eventos y notificar a sistemas externos a la solución. Este componente nos permite tener un medio de comunicación escalable, seguro, resiliente y distribuido, de manera asíncrono, entre distintos componentes de una arquitectura, los cuales podrían ser ambos internos o existir alguno externo como en este caso.

App Logic:

Este componente permite disparar flujos a partir de determinados eventos. En el contexto de esta solución se lo utiliza para realizar la actualización de datos, reaccionar a eventos del service bus y orquestar procesos tanto internos como externos.

Monitoreo de Servicios en Azure con Application Insigths

Al hablar de soluciones productivas, y más en un entorno empresarial, es de fundamental importancia poder monitorear la salud de nuestra solución. Dentro de los ambientes On Premise existen diversos mecanismos y software que ayudan a realizar esta tarea. Al pensar en una solución dentro de ambiente cloud, y más cuando nos orientamos al desarrollo sobre PaaS; esta tarea se puede volver compleja y podemos llegar a tener la sensación de “perdida de control”, o desconocimiento sobre el funcionamiento y salud del sistema.

La instrumentación es una de las principales características que distingue a un sistema corporativo y profesional, de uno que no lo es. Es fundamental no solo resolver lo que el negocio requiere, sino hacerlo de una forma en que podamos gobernar el sistema y saber que acción tomar para asegurar su crecimiento saludable.

Típicamente, los sistemas utilizan Performance Counters para exponer información que permite monitorear el funcionamiento interno del sistema, la mayoría de las aplicaciones que utilizamos definen sus propios performance counters, eventos de sistema, logs, trace, etc. Por tal motivo, monitorear la salud de un sistema depende de dos partes:

1. El sistema que desarrollamos debe implementar los mecanismos necesarios para su monitoreo, en función del nivel de control y conocimiento que se quiere tener del mismo en producción. De no hacerlo, corremos el riesgo de que el sistema opere como una caja negra y en producción no sepamos que ocurre.

2. Tener las herramientas correctas para acceder a la información de monitoreo generada por el sistema.

En este caso, utilizaremos Application Insights para monitorear nuestro sistema. Dentro de las capacidades de Applications Insights podemos monitorear los siguientes elementos:

  • Request rates, response times, and failure rates
  • Dependency rates, response times, and failure rates
  • Exceptions
  • Page Views and load performance
  • AJAX calls
  • User and session counts
  • Host Diagnostics
  • Diagnostics trace logs
  • Custom events and metrics

Podemos obtener más información de este servicio aquí.

Para este ejemplo, primero vamos a crear un Cloud Service con una solución Web en MVC:

Seleccionamos nuestro proyecto web, y dentro de la opción “Add” encontraremos la configuración de Applications Insights.

Seleccionamos la cuenta y la suscripción donde vamos a desplegar el servicio:

Una vez finalizado el proceso de configuración:

Una vez configurado, dentro de nuestro proyecto podremos encontrar los siguientes archivos:

Dentro del portal de Azure ya tendremos acceso al servicio de Application Insights:

Al ejecutar nuestra aplicación, incluso en el ambiente local, podremos obtener la información sobre como se comportó el sistema durante la ejecución:

Dentro del portal de Azure lo podemos visualizar de la siguiente manera

Cuando hacemos análisis de problemas dentro de nuestro sistema es importante tener en consideración todas las dependencias que existan, como servicios, repositorios de datos SQL, Storage, etc. Dado que nuestro problema puede provenir tanto de nuestro código como del uso que le damos a alguna de las dependencias.

Dentro de Application Insigths podemos definir todas nuestras dependencias para tener una vista completa del monitoreo de nuestra solución:

Documentación de Application Insights:

https://docs.microsoft.com/es-mx/azure/application-insights/