Es común que exista confusión entre los conceptos de monorepo y monolito, pero es crucial diferenciarlos. Un monorepo es una estrategia de organización de código donde múltiples proyectos y servicios se almacenan en un único repositorio. Esto facilita la gestión centralizada de dependencias y herramientas de desarrollo, permitiendo a los equipos colaborar de manera eficiente. Por otro lado, un monolito es un tipo de arquitectura de software en el que todos los componentes de una aplicación (como la interfaz de usuario, la lógica de negocio y la gestión de datos) están estrechamente integrados en una única base de código.

Monorepo no implica Monolito

Monorepo ≠ Monolito

Una vez que comprendes estas diferencias, se vuelven más evidentes. A continuación, presento una tabla que destaca las características clave:

 

Característica

Monorepo

Arquitectura Monolítica

Alcance

Gestión del repositorio, almacenando múltiples proyectos/servicios en un solo repositorio

Estructura y diseño de una sola aplicación, todos los componentes en una única base de código

Base de Código

Múltiples servicios, bibliotecas y proyectos en un solo repositorio

Una única base de código unificada para la aplicación

Despliegue

Los componentes pueden desplegarse independientemente (microservicios o aplicaciones independientes)

Se despliega como una sola unidad, todo está integrado

Granularidad

Proyectos independientes en el mismo repositorio, pueden estar débilmente acoplados

Todo está estrechamente integrado en una sola aplicación

Versionado

Todos los proyectos comparten la misma estrategia de versionado

Una sola versión para toda la aplicación

Escalabilidad

Los servicios o componentes pueden escalarse independientemente

Toda la aplicación debe escalarse como una sola unidad

Complejidad

La complejidad está en gestionar múltiples proyectos, dependencias y configuraciones

La complejidad surge al escalar y mantener la aplicación monolítica a medida que crece

Estructura del Monorepo

 En un monorepo, todos los proyectos (microservicios y librerías compartidas) se encuentran en un mismo repositorio.

/Monorepo  
|-- Monorepo.sln  
|-- /src  
|   |-- /MicroserviceA  
|       |-- MicroserviceA.csproj  
|       |-- Program.cs  
|       |-- Startup.cs  
|       |-- /Controllers  
|           |-- ControllerA.cs  
|       |-- /Models  
|           |-- ModelA.cs  
|   |-- /MicroserviceB  
|       |-- MicroserviceB.csproj  
|       |-- Program.cs  
|       |-- Startup.cs  
|       |-- /Controllers  
|           |-- ControllerB.cs  
|       |-- /Models  
|           |-- ModelB.cs  
|   |-- /SharedLibrary  
|       |-- SharedLibrary.csproj  
|       |-- /Utilities  
|           |-- Utility.cs  
|       |-- /Models  
|           |-- SharedModel.cs  
|-- /tests  
|   |-- /MicroserviceATests  
|       |-- MicroserviceATests.csproj 
|       |-- UnitTest1.cs  
|   |-- /MicroserviceBTests  
|       |-- MicroserviceBTests.csproj 
|       |-- UnitTest1.cs  
|-- /README.md  
|-- /.gitignore  

Estructura de un Multirepo

/MicroserviceA  
|-- MicroserviceA.sln  
|-- /src  
|   |-- MicroserviceA.csproj  
|   |-- Program.cs  
|   |-- Startup.cs  
|   |-- /Controllers  
|   |   |-- ControllerA.cs  
|   |-- /Models  
|       |-- ModelA.cs  
|-- /tests  
|   |-- MicroserviceATests  
|       |-- MicroserviceATests.csproj  
|       |-- UnitTest1.cs  
|-- README.md  
|-- .gitignore  

/MicroserviceB  
|-- MicroserviceB.sln  
|-- /src  
|   |-- MicroserviceB.csproj  
|   |-- Program.cs  
|   |-- Startup.cs  
|   |-- /Controllers  
|   |   |-- ControllerB.cs  
|   |-- /Models  
|       |-- ModelB.cs  
|-- /tests  
|   |-- MicroserviceBTests  
|       |-- MicroserviceBTests.csproj  
|       |-- UnitTest1.cs  
|-- README.md  
|-- .gitignore 

/PackageUtilitieA  
|-- PackageUtilitieA.sln  
|-- /src  
|   |-- PackageUtilitieA.csproj  
|   |-- /Utilitie  
|       |-- UtilitieA.cs  
|-- README.md  
|-- .gitignore  

/PackageUtilitieB  
|-- PackageUtilitieB.sln  
|-- /src  
|   |-- PackageUtilitieB.csproj  
|   |-- /Utilitie  
|       |-- UtilitieB.cs  
|-- README.md  
|-- .gitignore  

Es probable que hayas notado que los paquetes como PackageUtilitieA o PackageUtilitieB, los paquetes npm o NuGet, a menudo se gestionan dentro de un monorepo:

/SharedLibraryAsMonoRepo 
|-- SharedLibraryAsMonoRepo.sln  
|-- /src  
|   |-- /PackageUtilitieA  
|   |   |-- README.md  
|   |   |-- .gitignore  
|   |   |-- PackageUtilitieA.csproj  
|   |   |-- /Utilitie  
|   |       |-- UtilitieA.cs  
|   |-- /PackageUtilitieB  
|   |   |-- README.md  
|   |   |-- .gitignore  
|   |   |-- PackageUtilitieB.csproj  
|   |   |-- /Utilitie  
|   |       |-- UtilitieB.cs  
|-- README.md  

Al final, la elección entre un monorepo y un multirepo dependerá de las necesidades específicas de tu equipo y proyecto, considerando aspectos como la colaboración, la gestión de dependencias y las estrategias de despliegue.

Otros artículos relacionado: