Buenas Prácticas Para Desarrollar Aplicaciones en Azure
Tags: azure, architecture, dotnet, cloud
Published: 2022-08-21 08:52:59

Continuando con los post anteriores, después de revisar las opciones de arquitectura de soluciones y algunas propuesta de servicios viene la siguiente pregunta, ¿ ahora que procedimientos debo tomar en cuenta para realizar la implementación de mi arquitectura?
Bien, para eso Microsoft nos proporciona un compendio de buenas practicas para así en combinación de algunas o todas las practicas podamos ofrecer soluciones mas robustas a nuestros clientes, siempre preservando los atributos de calidad de nuestras soluciones, este compendio se conforma por las siguientes prácticas:

**Diseño de API:**
Para diseñar nuestras API debemos considerar algunos puntos estratégicos de nuestra arquitectura, ya que no solo se trata de exponer todo a través de una API, ya sea web o algún ensamblado, se trata de proveer a nuestro consumidor la funcionalidad que se necesita, y para esto nos podemos basar en implementar nuestras apis con algún patrón de arquitectura como clean architecture o DDD sobre .NET para con ello mejorar la experiencia de desarrollo y consumo por parte de nuestros clientes.

**Implementación de API:**
Como se menciona anteriormente una vez diseñada la arquitectura de software ahora viene la parte de la implementación, y para esto podríamos empezar a visualizar diferentes alternativas, por ejemplo si  tenemos nuestra aplicación con DDD o Clean architecture tenemos la posibilidad de separar en microservicios y para eso podemos montarlo en Azure Service Fabric o [Azure Kubernetes Services](https://www.youtube.com/watch?v=mp63hVVZOMw) pero si no es necesario podríamos utilizar App services o Storage, cada que se implementa el API hay que considerar el performance, control de excepciones y el manejo de solicitudes de gran tamaño.

**Escalabilidad Automática:**
Una vez mas, todo parte del diseño, este es un gran reto por que nuestra solución debe ser capaz de de utilizar los recursos que se proporcionen a medida, es decir que cuando se asignen o se desasignen recursos la solución deberá ser capaz de continuar trabajando y utilizar esos mismos a demanda, para esto el runtime de .NET 6/7, etc ofrece muy buenas características para la programación y Azure provee escalado automático en muchos componentes.

**Trabajos en segundo plano:**
Suele pasar, siempre hay un proceso en la empresa que tarda o es necesario trabajar con lógica de negocio y muchos datos en un momento, para eso podríamos implementar trabajos en segundo plano o por lotes, por ejemplo para poder procesar grandes volúmenes de información de muchos clientes podríamos usar un Azure Streaming Analitics en conjunto con algún almacenamiento como Azure Cosmos DB, ya que podríamos desencadenar eventos o trabajar con los resultados de las tareas.

**Almacenamiento en cache / Red de entrega de contenido:**
El usuario lo quiere ya!, si resulta ser que tenemos estándares muy altos de respuesta, ya que nuestra aplicación con un app services básico con 5 usuarios anda genial, pero, cuando llega un golpe de 100M usuarios que pasa?, si, si sabes que pasa. Para esto en diseño de nuestra solución podríamos considerar el uso de servicios de almacenamiento en caché, esto con el fin de leer los datos con mas frecuencia pero que no se modifican constantemente, por ejemplo con [Azure Redis Cache](https://www.youtube.com/watch?v=D3Wa_zgQB6c) podemos dar solución a la parte de datos pero ¿Qué pasa con el contenido estático?. Para eso podríamos implementar algún CDN por ejemplo el que nos provee Azure mismos para reducir de manera considerable el tiempo de carga de los sitios web o apps que tenga nuestra solución.

**Creación de particiones de datos:**
La data, el corazón de las soluciones, para poder manejar grandes volúmenes de información podemos aquí empezar a pensar en que podemos tener un almacenamiento poliglota, es decir que podemos tener diferentes tipos de base de datos dependiendo el fin al que queremos, por ejemplo para nuestras transacciones podemos seguir utilizando nuestro SQL Server pero para búsquedas podríamos Utilizar un Cosmos DB , o un Data Lake para crear un DataWarehouse entre otras características. Con esto nuestro sistema de vuelve mas escalable y resiliente ante cambios de reglas de negocio u otros aspectos.

**Supervisión y diagnostico:**
El seguimiento es vital, necesitamos saber que pasa con nuestra aplicación en todo momento para tomar buenas decisiones de mejora de arquitectura o performance , recordemos que constantemente para mejorare nuestra solución podemos revisar algunos logs o estadísticas en tiempo real que ayudan perfectamente a revisar, analizar y decidir los siguientes features o fix bugs necesarios en nuestra solución. para eso podemos usar por ejemplo el conocido application insights para llevar un control de todo lo que pasa en nuestra aplicación.

**Estrategia de reintentos:**
Podemos adaptar nuestra solución para implementar mecanismos de reintento, ya sea por algún SDK de algún proveedor o nosotros realicemos esa programación, es una característica esencial para desarrollar aplicaciones y soluciones resilientes y adaptables al cambio mas cuando las carga de trabajo de nuestra aplicación es impredecible.

Bien ¿tu que opinas?, cuando desarrollas soluciones ¿Cómo lo haces?, ¿sabias de alguno de estos principios?, si los sabes ¿los aplicas? , me gustaría saber tu opinión acerca de estos puntos y como todo, no es una verdad absoluta solo es una serie de recomendaciones propuestas por Microsoft para darle calidad a nuestras soluciones en Azure.
Hasta aquí el post de hoy, espero les sirva y dejen sus comentarios para seguir mejorando, comparto mis redes para cualquier duda, y dirían por ahí ¡voy y vengo!

[Twitter](https://twitter.com/RicardoJosue04)
[YouTube](https://www.youtube.com/c/RicardoJosue)
[Facebook](https://www.facebook.com/RicardoJosue04/)
[Linkedin](https://www.linkedin.com/in/ricardojosue/)