Recepción: junio 22, 2022
Aprobación: agosto 17, 2024
Resumen: La gestión eficiente de datos es esencial en la administración pública para el funcionamiento efectivo de los sistemas catastrales municipales. En 2010, se implementó el Programa de Modernización Catastral Multifinalitario, una alianza entre el gobierno del municipio de Puebla y Sistemas de Información Geográfica S.A. de C.V. (SIGSA), que incluía la plataforma ServerBox. Con el tiempo, la arquitectura monolítica de ServerBox presentó limitaciones en mantenimiento, actualización y despliegue de cambios. Este proyecto plantea la hipótesis de que migrar ServerBox a una arquitectura de microservicios distribuidos, aplicando una arquitectura vertical, puede superar estos desafíos y mejorar áreas operativas del sistema. El diseño propuesto establece una estructura modular y escalable que facilita el mantenimiento y la evolución del sistema. La implementación incluye el desarrollo de TagHelpers en ASP.NET Core para simplificar la creación de elementos HTML y el uso de snippets para agilizar la codificación. Además, se define un archivo de configuración JSON para gestionar múltiples entornos de despliegue. Este enfoque estratégico para la migración del sistema ServerBox a una arquitectura distribuida y vertical ofrece ventajas significativas en términos de escalabilidad, mantenimiento y eficiencia en el desarrollo de software, y puede servir de guía para proyectos similares en la administración pública.
Palabras clave: Sistema Distribuido, Arquitectura Vertical, Microservicio, TagHelper, Migración.
Abstract: Efficient data management is essential in public administration for the effective operation of municipal cadastral systems. In 2010, the Multifinality Cadastral Modernization Program was implemented, a partnership between the Puebla municipality government and Sistemas de Información Geográfica S.A. de C.V. (SIGSA), which included the ServerBox platform. Over time, the monolithic architecture of ServerBox showed limitations in maintenance, updates, and change deployment. This project hypothesizes that migrating ServerBox to a distributed microservices architecture, using a vertical approach, can overcome these challenges and improve operational areas of the system. The proposed design establishes a modular and scalable structure that facilitates system maintenance and evolution. The implementation includes the development of TagHelpers in ASP.NET Core to simplify HTML element creation and the use of snippets to streamline coding. Additionally, a JSON configuration file is defined to manage multiple deployment environments. This strategic approach to migrating ServerBox to a distributed and vertical architecture offers significant advantages in terms of scalability, maintenance, and software development efficiency, and can serve as a guide for similar projects in public administration.
Keywords: Distributed System, Vertical Architecture, Microservice, TagHelper, Migration.
1. Introducción
En el ámbito de la administración pública, la gestión eficiente y precisa de datos es esencial para el funcionamiento efectivo de cualquier sistema catastral municipal. Sin embargo, muchos municipios se enfrentan a desafíos significativos en este aspecto, como lo evidencia el caso del sistema de catastro del municipio de Puebla en el año 2010. En ese año, el sistema enfrentaba retos considerables debido a la desvinculación entre su base de datos cartográfica y tabular, así como a la obsolescencia de sus sistemas y la falta de coordinación entre los distintos procesos.
Para abordar estos desafíos, se lanzó el Programa de Modernización Catastral Multifinalitario, una iniciativa conjunta entre el Gobierno Municipal y la empresa. Parte integral de esta modernización fue la implementación de la plataforma ServerBox [1]. Sin embargo, con el tiempo, la arquitectura monolítica de ServerBox comenzó a presentar limitaciones en términos de mantenimiento, actualización y despliegue de cambios.
Ante esta problemática, surge la hipótesis de que migrar la arquitectura de ServerBox hacia un sistema distribuido de microservicios, aplicando una arquitectura vertical, podría resolver estos desafíos y mejorar significativamente diversas áreas de operación del sistema.
Para alcanzar este objetivo, se han trazado objetivos específicos que abordan aspectos cruciales del desarrollo, tales como el diseño e implementación de una nueva versión del sistema. Estas metas específicas incluyen la mejora del tiempo de despliegue en producción, la optimización de las tareas de mantenimiento en las funcionalidades existentes, la garantía de una escalabilidad óptima del sistema, la reducción de la curva de aprendizaje para nuevos programadores, la minimización de la probabilidad de errores que puedan afectar la integridad del sistema y el establecimiento de pruebas unitarias para las funciones de las APIs.
Estos objetivos específicos se encuentran alineados con la misión general de migrar hacia una arquitectura de microservicios distribuidos, y una arquitectura vertical, representando así un enfoque profesional y estratégico hacia la evolución del sistema ServerBox.
En la sección 2 se presenta una revisión de la literatura relacionada, abordando las ventajas y desafíos de ambas arquitecturas. En la sección 3 se presentan los conceptos claves relacionados a este trabajo. En la sección 4 se muestra el diseño propuesto para el sistema distribuido. En la sección 5 se presenta el desarrollo de software y los elementos para la implementación de la propuesta de solución. En la sección 6 se presenta las pruebas y resultados obtenidos. En la sección 7 se presentan las conclusiones. En la sección 8 se presenta una breve discusión de lo aprendizaje obtenido con este trabajo, finalmente tenemos el trabajo futuro y la bibliografía.
2. Estado del arte
El trabajo de Montiel Luna [2] se centra en la definición de una arquitectura de software para aplicaciones empresariales multiplataforma, con su implementación en el módulo de registro de aspirantes del SIIA de la UATx. Este enfoque, basado en patrones como Cliente-Servidor, Microservicios y Capas, demuestra ser fácil de implementar, sin costos adicionales significativos y con beneficios notables en términos de mantenibilidad, escalabilidad y rendimiento, gracias a la aplicación de buenas prácticas del marco SCRUM.
En [3] se aborda la migración de un módulo de software a un microservicio en un contexto industrial, utilizando un caso de estudio de la empresa EDICOM. El proyecto demostró que la migración a microservicios tiene impactos positivos en el mantenimiento, eficiencia, escalabilidad y tolerancia a fallos del sistema, contribuyendo así a mejorar la calidad del servicio empresarial.
Por otro lado, en [4] se enfoca en la evaluación de las ventajas e inconvenientes de una arquitectura basada en microservicios frente a una arquitectura monolítica. El caso de estudio, que implica el desarrollo de una aplicación móvil para el comercio electrónico, revela que mientras las actividades de despliegue y pruebas pueden ser más desafiantes en una solución basada en microservicios, las de mantenimiento e implementación son más manejables debido a la menor y más flexible base de código.
Estos trabajos muestran la diversidad de enfoques en la implementación de arquitecturas de software, desde la definición de estructuras para sistemas multiplataforma hasta la migración estratégica a microservicios en contextos industriales, y la evaluación exhaustiva de las ventajas e inconvenientes asociados.
Estos estudios contribuyen significativamente al entendimiento y aplicación práctica de las arquitecturas de software en distintos contextos, proporcionando valiosas lecciones y recomendaciones para futuras investigaciones y desarrollos en este campo.
3. Conceptos fundamentales
Arquitectura monolítica: Es aquel que se concibe como un único elemento funcional donde sus prestaciones se ofrecen a través de una sola pieza de código que resuelve la presentación al usuario (interface), el acceso a los datos y la lógica algorítmica del problema que aborda [5].
Sistema distribuido: Son aquellos en el que dos o más máquinas colaboran para la obtención de un resultado y están basados en las características de transparencia, eficiencia, flexibilidad, escalabilidad y fiabilidad [6].
Microservicios: Es un enfoque al desarrollo de una única aplicación como un conjunto de pequeños servicios, cada uno ejecutándose en su propio proceso y comunicándose con mecanismos, a menudo una API de recursos HTTP [7].
Arquitectura vertical: Es un enfoque para la construcción de software que se centra en entregar funcionalidad completa y utilizable en cada iteración del ciclo de desarrollo [8].
4. Diseño
En la Figura 1 se establecen las etapas previas del proceso de migración.
Estas etapas contemplan las siguientes actividades:
En Figura 2 se muestra la arquitectura propuesta, la cual consta de una librería global de funciones para los microservicios y los micrositios, un Gateway como punto de enlace entre los microservicios y los micrositios, 13 microservicios que interactúan con la base de datos tabular y cartográfica, 8 micrositios que agrupan el conjunto de herramientas para cada área de catastro, y un portal que funciona con punto de entrada del usuario al sistema.
De manera detallada la estructura de la arquitectura distribuida es:
Sesión: proporciona funciones específicas para gestionar la autenticación, autorización y el estado de la sesión de los usuarios.
Seguridad: proporciona EndPoint CRUD para toda la parte de seguridad del sistema (usuarios y permisos).
Catálogos: proporciona EndPoint CRUD para todos los catálogos del sistema.
Historial: proporciona EndPoint CRUD para almacenar el historial de movimientos de las cuentas prediales, tales como pagos, adeudos, información del predio, información del propietario, información del copropietario, terreno y construcción.
Trámites: proporciona EndPoint CRUD para el tratamiento de los tramites, solicitudes, etapas del trámite y actividades del usuario.
Padrón: proporciona EndPoint CRUD para cualquier consulta relacionada con el predio, propietario, copropietario y cuentas prediales.
Historial geográfico: proporciona EndPoint para almacenar el historial de los movimientos cartográficos.
Ingreso – egresos: proporciona EndPoint CRUD para cualquier operación relacionada con adeudos, pagos, pagos cancelados, parcialidades.
Registro: proporciona funciones específicas para supervisar el comportamiento de la aplicación, diagnosticar problemas y mejorar continuamente la calidad del software.
ABI: proporciona EndPoint CRUD para las operaciones exclusivas de ABI.
Visor: proporciona EndPoint CRUD para las operaciones exclusivas de visor municipal.
Inspección: proporciona EndPoint CRUD para las operaciones exclusivas de inspección.
Valuación: proporciona EndPoint CRUD para las operaciones exclusivas de valuación.
Portal. Aplicación web que será el núcleo de acceso a ServerBox.
Predial. Aplicación web que contendrá todas las funcionalidades relacionadas a predial.
Tramite. Aplicación web que contendrá todas las funcionalidades relacionadas a tramites.
ABI. Aplicación web que contendrá todas las funcionalidades relacionadas a ABI.
Valuación. Aplicación web que contendrá todas las funcionalidades relacionadas a valuación.
Inspección. Aplicación web que contendrá todas las funcionalidades relacionadas a Inspección.
Catálogos. Aplicación web que contendrá todas las funcionalidades relacionadas a catálogos, así como la administración de usuarios, perfiles.
Reporte. Contenedor de los reportes de las aplicaciones web de los puntos ii al vii.
Visor. Aplicación web que utiliza ArcGIS para realizar consultas espaciales vs datos tabulares.
La división de un microservicio aplicando la arquitectura vertical implica organizar cada funcionalidad del sistema en componentes independientes, en la Figura 3 se muestran estos componentes, request, response y handler, cada uno encargado de manejar un aspecto específico de la lógica de negocio. Esta organización se basa en el principio de responsabilidad única, donde cada componente se enfoca en una tarea claramente definida.
Esta estructura de división vertical permite una organización clara y modular del código, lo que facilita el mantenimiento, la escalabilidad y la evolución del sistema a lo largo del tiempo. Cada componente se enfoca en una tarea específica y puede ser desarrollado, probado y desplegado de manera independiente, lo que favorece la agilidad y la eficiencia en el desarrollo de software.
A través de este diseño, se han identificado varias ventajas significativas que ofrecen tanto la arquitectura distribuida como la vertical en este contexto específico.
Una de las principales ventajas de la arquitectura distribuida es su capacidad para mejorar la escalabilidad del sistema. Al distribuir la carga de trabajo entre múltiples servidores, se puede aumentar la capacidad de respuesta del sistema y manejar un mayor volumen de usuarios y transacciones sin comprometer el rendimiento. Esto es especialmente relevante para ServerBox, donde la demanda de servicios puede variar considerablemente y se requiere una infraestructura flexible y adaptable.
Por otro lado, la adopción de la arquitectura vertical permite una mejor organización y modularidad del código, lo que facilita el mantenimiento y la evolución del sistema a lo largo del tiempo. Al dividir la funcionalidad en componentes independientes, cada uno es responsable de una tarea específica, se reduce la complejidad del código y se mejora la legibilidad y la mantenibilidad.
5. Implementación
Con la finalidad de cumplir con los objetivos de este proyecto se desarrollaron un conjunto de TagHelpers que son una forma de simplificar la creación de elementos HTML en ASP.NET Core, que permiten en primer lugar normalizar los controles de uso general, y en segundo disminuir las líneas de código necesarias, dejando la tarea al compilador para aplicar el cambio en tiempo de ejecución. En la Tabla 1 se muestran los 16 TagHelpers desarrollados con una breve descripción.
Cada TagHelper tiene su propio conjunto de propiedades. Para ilustrar sus beneficios, consideremos el uso del TagHelper X-TextoBox en el archivo inicio.cshtml, sólo es necesario incluir la siguiente línea:
Este elemento es fácilmente reutilizable en cualquier parte del proyecto, lo que simplifica la redundancia de código y fomenta la limpieza de los archivos. Esto permite que el enfoque del desarrollo se centre en la funcionalidad, en lugar de la implementación repetitiva en cada instancia. Además, el mantenimiento se vuelve significativamente más sencillo, ya que cualquier ajuste o modificación sólo requiere modificaciones en un único lugar. Sin el uso del TagHelper, el código requerido es:
En la Figura 4 se ilustra el resultado obtenido al emplear este TagHelper.
Para agilizar la codificación se crearon un conjunto de snippets (fragmentos de código) definidos en la Tabla 2 que permiten al desarrollador centrarse en la funcionalidad. Para utilizar los snippet en Visual Studio 2022 es necesario realizar lo siguiente:
Por ejemplo, para usar el snippet jcActionPost, en el editor se empieza a escribir el atajo a utilizar, como se puede ver en la Figura 5, al remarcarse se presiona doble tab.
Al realizar esta acción el editor agrega el fragmento de código que se muestra en la Figura 6, donde MyMethod y MyClave son configurables.
La Figura 7 muestra el resultado final, en este caso al reemplazar MyMethod por ListaPermisos y presionar tab se rellena los demás MyMethod que se están en el fragmento recién agregado.
Dependiendo de la cantidad de ambientes en los cuales se requiere desplegar los microservicios, es necesario definir un archivo individual para cada uno de acuerdo con la documentación de ocelot, incluyendo las correspondientes especificaciones de los endpoints del gateway.
Esta situación implica que los desarrolladores deben escribir código similar en varios archivos. Para abordar este desafío y facilitar la publicación teniendo en cuenta el número de despliegues y los entornos, se ha diseñado un archivo llamado "config.iam" en formato JSON, en la Figura 8 se muestra la estructura del archivo.
Este archivo se utiliza para implementar un algoritmo que lee su contenido y crea los directorios de publicación en base al arreglo del nodo “destino” que permite crear las N configuraciones, utilizando como base la configuración del ambiente de depuración. De esta manera, se asegura que todos los archivos tengan las mismas definiciones de métodos.
En el desarrollo del proyecto de transición de un sistema monolítico a una arquitectura de microservicios, se utilizó el marco de trabajo ágil Scrum para gestionar la implementación de manera eficiente. Este enfoque permitió mantener un ritmo constante de desarrollo, adaptarse rápidamente a los cambios y entregar valor de manera continua. La Figura 9 muestra la estructura base de los microservicios API el cual se desglosa de la siguiente manera:
Common. Carpeta con clases generales.
Behaviours. Carpeta con clases que canalizan las peticiones.
Extensions. Carpeta con clases que extienden la funcionalidad de las clases.
Handler. Carpeta con clases que implementan manejadores globales.
Controllers. Carpeta de controladores.
Features. Carpeta con todas las implementaciones de funcionalidades con arquitectura vertical.
Infrastructure. Carpeta que contiene los objetos de la base de datos.
En la Figura 10 se muestra la estructura base de los micrositios web el cual se desglosa de la siguiente manera:
Wwwroot
CSS. Carpeta con las hojas de estilo.
Dist. Carpeta con archivos minificados para la publicación.
JS. Carpeta con archivos JavaScript minificados.
CSS. Carpeta con archivos de hojas de estilo minificados.
JS. Carpeta con archivos JavaScript sin minificar.
Lib. Carpeta con archivos de terceros JavaScript y hojas de estilo.
Recursos. Carpeta con archivos, imágenes, archivos de texto, etc.
Common. Carpeta con clases generales.
Controllers. Carpeta de controladores.
Domain. Carpeta de clases globales.
View. Carpeta con las vistas.
Reuniendo todo lo anterior se definió la estructura general de la solución ServerBox que podemos ver en la Figura 11 como sistema distribuido aplicando una arquitectura vertical en el desarrollo de las APIs.
6. Pruebas y resultados
Para realizar las pruebas se usó la herramienta Postman que permite realizar solicitudes HTTP de manera eficiente y verificar las respuestas obtenidas. Usando Postman, podremos detectar errores en las APIs, validar los datos devueltos y asegurar la correcta integración de los microservicios.
Además, esta herramienta facilita la documentación y la repetición de pruebas, lo que es esencial para mantener la calidad y la fiabilidad del sistema a lo largo del tiempo. Los pasos para realizar las pruebas se indican en la Figura 12.
En la Figura 13 se muestra el resultado de ejecutar el endPoint que permite iniciar sesión, el cual está en la url https://servidor:444/SBX.Api.Gateway/Sesion/IniciarSesion todo esto sin necesidad de ejecutar toda la solución, en este caso sólo fue necesario el microservicio de sesión y el del gateway.
En la Tabla 3 se muestra la eficiencia de codificación que representan los TagHelper con una reducción en promedio del 89% de líneas de código, lo que implica código más limpio como se puede ver en la Figura 14.
Para verificar la eficiencia de la generación de las publicaciones se registraron los tiempos de 100 ejercicios publicando el sistema monolítico y 100 ejercicios publicando el sistema distribuido con la variante que el sistema distribuido se genera diferente cantidad de microservicios y micrositios, con lo cual se obtienen tiempos menores al publicar sólo una parte, en comparación de siempre estar publicando todo el sistema, tal como muestra la Figura 15.
En la Figura 16 se muestra el tiempo acumulativo, donde la pendiente para el sistema monolítico es mayor que la del sistema distribuido. Esto implica que se ha invertido más tiempo para publicar cambios en el sistema monolítico en comparación con el sistema distribuido.
En una arquitectura distribuida, no es necesario publicar todo el sistema cada vez que se realizan cambios; sólo se despliegan las partes que han sido editadas. Esta diferencia en las pendientes refleja la mayor eficiencia y menor tiempo de actualización del sistema distribuido, demostrando su capacidad para manejar cambios de manera más ágil y escalable.
7. Conclusiones
Al concluir este proyecto de migración, se puede afirmar que presenta múltiples beneficios que respaldan la hipótesis planteada. Aunque inicialmente se presentaron desafíos debido al método de desarrollo anterior (monolítico), con el tiempo se hicieron evidentes las ventajas de la nueva estructura. Al principio, la arquitectura vertical parecía extraña, pero sus beneficios se volvieron claros gradualmente.
La implementación del sistema distribuido con arquitectura vertical ha sido un éxito, ya que se alcanzaron los objetivos propuestos. Aunque el primer despliegue en el servidor fue desafiante, las actualizaciones posteriores fueron más fluidas y rápidas, al no tener que publicar todo el sistema, sino solo los microservicios que se modificaron.
La arquitectura vertical aisló las funcionalidades, facilitando la comprensión del código y reduciendo la curva de aprendizaje para nuevos integrantes del grupo de desarrollo. Además, las pruebas con Postman fueron vitales para detectar errores en las APIs y descubrir los datos devueltos sin necesidad de ejecutar toda la solución.
Los snippets y TagHelpers han demostrado ser útiles para avanzar en el trabajo, facilitando el mantenimiento y la adición de nuevas funciones, y permitiendo centrarse en el desarrollo y/o actualización de cada funcionalidad.
Por lo tanto, migrar un sistema monolítico a uno distribuido requiere un análisis cuidadoso y debe realizarse en proyectos grandes y complejos, ya que, en proyectos pequeños, los beneficios se ven limitados.
8. Discusión
La investigación sobre la migración de un sistema monolítico a uno distribuido ha demostrado un gran aprendizaje y mejoras significativas en la eficiencia del proceso. Se logró que la separación del sistema fuera imperceptible para el usuario final, manteniendo la experiencia de uso intacta.
La división en módulos más pequeños y funciones aisladas simplificó el desarrollo, haciendo que se trabaje como si fueran pequeños proyectos individuales. Esto ha resultado especialmente útil en sistemas que requieren una evolución constante, permitiendo agregar nuevas funcionalidades sin recompilar todo el proyecto, lo que reduce tiempos y minimiza errores.
El mantenimiento también ha superado las expectativas. La posibilidad de ajustar una función sin afectar al resto del sistema mejora significativamente la flexibilidad y estabilidad del software.
No obstante, la transición presentó desafíos, principalmente debido a la resistencia al cambio de paradigmas de trabajo. Sin embargo, al superar esta barrera, se evidencian claramente los beneficios de un sistema distribuido.
Se espera que estos hallazgos contribuyan al debate sobre las mejores prácticas en la industria del software y ayuden a otros profesionales a enfrentar los desafíos asociados con la migración de sistemas monolíticos.
9. Trabajo futuro
Para futuras investigaciones, se recomienda explorar la migración de la base de datos a una arquitectura distribuida como una forma de mejorar aún más el rendimiento y la escalabilidad del sistema. Este enfoque podría permitir que cada microservicio gestione su propio conjunto de datos, superando las limitaciones de las arquitecturas monolíticas y proporcionando una solución más flexible y escalable. Investigar cómo la implementación de una base de datos distribuida puede optimizar la interacción entre servicios y facilitar la escalabilidad independiente de cada componente sería un área de gran interés.
Otro aspecto para futuras investigaciones es el desarrollo de métodos más eficientes para la publicación de microservicios y micrositios. Se podría investigar la automatización del proceso de publicación, la integración de herramientas avanzadas de integración continua (CI), y la implementación de prácticas que minimicen la intervención manual. Estos esfuerzos podrían resultar en una mayor eficiencia en el despliegue, reducción de errores y adaptación más rápida a nuevos requisitos, ofreciendo una base sólida para la evolución y el mantenimiento continuo de sistemas distribuidos en contextos similares.
10. Referencias
[1] SIGSA. (2024). Serverbox | SIGSA. https://www.sigsa.info/es-mx/productos/server/serverbox
[2] Montiel Luna, F. (2023). Arquitectura de software para aplicaciones empresariales multiplataforma. Congreso Internacional de Investigación, Puebla.
[3] García Gonzálvez, F. (2023). Migración de un módulo software a un microservicio en un contexto industria [Tesis de Grado]. Universitat Politécnica de Valencia, España. http://hdl.handle.net/10251/192801
[4] Iranzo Jiménez, V. A. (2018). Desarrollo de software basado en microservicios: un caso de estudio para evaluar sus ventajas e inconvenientes [Tesis de Grado]. Universitat Politécnica de Valencia, España. http://hdl.handle.net/10251/111173
[5] Arcidiacono, J. (2020). Arquitectura de microservicios distribuidos para una plataforma que orquesta actividades orientadas a la recolección de datos con intervención humana. XXIII Concurso de Trabajos Estudiantiles (EST), Argentina. http://sedici.unlp.edu.ar/handle/10915/115887
[6] Islas Vera, M. P. (2004). Libreria SCII para la creacion de imagenes irreales en un ambiente distribuido [Tesis de Licenciatura]. Universidad de las Américas Puebla, México. http://catarina.udlap.mx/u_dl_a/tales/documentos/lis/islas_v_mp/
[7] Fowler, M., Lewis, J. (2014). Microservices. https://martinfowler.com/articles/microservices.html
[8] Santamaria, A. (2022). Vertical Slice Architecture (+DDD). https://www.plainconcepts.com/es/recursos/vertical-slice-architecture/