Per entendre bé què aporten els microserveis cal entendre igual de bé allò amb què es comparen: l'arquitectura monolítica. És la manera més habitual de construir programari, la que fa servir avui TechCorp i, probablement, la que has utilitzat a la majoria dels teus projectes. Lluny de ser una relíquia, el monòlit té virtuts importants i, ben construït (l'anomenat monòlit modular), és una opció excel·lent per a moltíssims sistemes.

En aquesta lliçó definirem què és un monòlit i les seves variants, compararem totes dues arquitectures dimensió a dimensió amb una taula i diagrames, i seguirem pas a pas el cicle de vida d'un mateix canvi funcional ("afegir cupons de descompte a la botiga de TechCorp") en cadascuna d'elles per veure on són les diferències reals. Acabarem desmuntant el mite que el monòlit és sempre l'opció dolenta. Aquí encara no decidirem quan convé l'una o l'altra (això arriba a la lliçó 01-04) ni veurem la tècnica de dividir un monòlit (lliçó 02-02).

Contingut

  1. Què és un monòlit
  2. El monòlit modular: un punt intermedi
  3. Comparativa dimensió a dimensió
  4. Els dos sistemes en diagrames
  5. Un mateix canvi, dos cicles de vida: cupons de descompte a TechCorp
  6. Altres alternatives: SOA i monòlit modular com a destinació
  7. El mite que el monòlit és sempre dolent
  8. Errors comuns i consells
  9. Exercicis
  10. Conclusió

  1. Què és un monòlit

Un monòlit és una aplicació construïda i desplegada com una única unitat: un sol procés (o un sol artefacte que s'executa en diversos processos idèntics), habitualment un sol repositori de codi, i gairebé sempre una sola base de dades. Tota la funcionalitat (interfície, lògica de negoci, accés a dades) viu al mateix desplegament.

Característiques típiques:

  • Una unitat de desplegament: es compila o s'empaqueta tot junt i es puja tot junt. A TechCorp, techcorp-shop és un únic projecte Node.js que s'arrenca amb node servidor.js i serveix tota la botiga.
  • Crides internes en memòria: quan el mòdul de comandes necessita comprovar l'estoc, crida una funció del mòdul d'inventari al mateix procés. Res no viatja per la xarxa.
  • Una base de dades compartida: totes les taules (clients, productes, estoc, comandes, pagaments, notificacions) són al mateix PostgreSQL i qualsevol mòdul pot consultar qualsevol taula. Les transaccions abasten tot el que calgui.
  • Escalat horitzontal per rèplica completa: si cal més capacitat, s'executen diverses còpies idèntiques del monòlit darrere d'un balancejador.

És important subratllar que "monòlit" no vol dir "codi desordenat". Un monòlit pot estar perfectament organitzat en capes i mòduls. Quan el codi d'un monòlit està embolicat, sense límits interns clars, es parla de big ball of mud ("gran bola de fang"), que és un problema de qualitat, no d'arquitectura de desplegament.

  1. El monòlit modular: un punt intermedi

Un monòlit modular és un monòlit el codi del qual està dividit en mòduls amb límits explícits, cadascun amb la seva API interna i, en la versió més disciplinada, amb el seu propi esquema o conjunt de taules a què els altres mòduls no accedeixen directament. Continua desplegant-se com una unitat, però per dins s'assembla molt a un conjunt de microserveis que viuen al mateix procés.

Aspecte Monòlit "clàssic" Monòlit modular Microserveis
Unitat de desplegament Una Una Una per servei
Límits entre àrees Difusos o inexistents Explícits (mòduls amb API interna) Explícits (processos amb API de xarxa)
Accés a dades Qualsevol mòdul llegeix qualsevol taula Cada mòdul accedeix només a les seves taules Cada servei té la seva base de dades
Comunicació interna Crides a funcions sense restricció Crides a funcions a través de l'API del mòdul Crides HTTP o missatges
Cost de la xarxa Cap Cap Present a cada interacció

El monòlit modular té un valor doble: és una arquitectura excel·lent per si mateixa, i a més és el millor punt de partida si algun dia es vol migrar a microserveis, perquè els límits ja estan traçats. Un mòdul ben aïllat es pot "extreure" a un servei amb relativa facilitat; una bola de fang, no. Tornarem sobre aquesta idea al mòdul 2.

  1. Comparativa dimensió a dimensió

Aquesta és la taula central de la lliçó. Compara totes dues arquitectures en les dimensions que més importen a la pràctica. Llegeix-la amb calma; gairebé cada fila correspon a una lliçó posterior del curs.

Dimensió Monòlit Microserveis
Desplegament Una unitat. Qualsevol canvi, per petit que sigui, implica desplegar tota l'aplicació. Desplegaments menys freqüents i més "grans". Una unitat per servei. Cada equip desplega el seu servei quan vol. Desplegaments petits i freqüents, però molts més pipelines a mantenir.
Escalat Es replica tota l'aplicació encara que només una part necessiti capacitat. Senzill però poc eficient. S'escala cada servei de manera independent segons la seva càrrega. Eficient, però exigeix orquestració i balanceig per servei.
Dades Una base de dades compartida. Transaccions ACID entre qualsevol taula. Consistència immediata i senzilla. Una base de dades per servei. No hi ha transaccions globals; consistència eventual i patrons com les sagues. Cada servei tria el seu motor.
Equips Diversos equips treballen sobre el mateix codi i el mateix desplegament; es trepitgen i necessiten coordinar-se. Cada equip és propietari dels seus serveis de cap a cap. Menys coordinació en el dia a dia, però cal governança comuna.
Tecnologia Un únic stack per a tota l'aplicació. Canviar de versió d'un framework afecta tot. Cada servei pot fer servir el seu stack. Llibertat, a canvi de més tecnologies a mantenir.
Proves Les proves de cap a cap són fàcils: s'arrenca l'aplicació i es prova. Les suites creixen i es tornen lentes. Provar un servei aïllat és ràpid. Provar la integració de molts serveis és difícil: calen proves de contracte i entorns complexos.
Rendiment Crides internes en memòria, gairebé gratuïtes. Consultes SQL amb JOIN entre qualsevol taula. Cada interacció entre serveis creua la xarxa: latència, serialització, possibles fallades. Els "joins" entre dades de diferents serveis s'han de fer a l'aplicació.
Tolerància a fallades Un error greu (fuita de memòria, excepció no controlada) pot tombar tota l'aplicació. Un servei caigut no ha de tombar necessàriament els altres, si es dissenya bé la resiliència. Però hi ha molts més punts de fallada.
Cost inicial Baix. Un projecte, un servidor, una base de dades. Es comença a lliurar valor en dies. Alt. Calen contenidors, orquestració, missatgeria, observabilitat, CI/CD per servei... abans que la primera funcionalitat sigui en producció.
Complexitat És al codi: a mesura que creix, es torna difícil d'entendre i de canviar. És a les interaccions: cada servei és simple, però el conjunt és un sistema distribuït.
Depuració Un procés, un log, un depurador. Molts processos, molts logs; cal traçabilitat distribuïda per seguir una petició.

Una manera útil de llegir la taula: el monòlit és senzill al principi i es complica en créixer; els microserveis són complicats al principi i mantenen la complexitat acotada en créixer. La qüestió d'on és el punt d'encreuament és exactament el que abordarem a la lliçó següent.

  1. Els dos sistemes en diagrames

El monòlit de TechCorp (situació actual)

flowchart TB
    Client[Navegador / App mòbil]
    subgraph Monòlit techcorp-shop (Node.js + Express, un sol procés)
        direction TB
        R[Rutes Express]
        subgraph Mòduls
            MC[clients]
            MCat[catàleg]
            MI[inventari]
            MP[comandes]
            MPa[pagaments]
            MN[notificacions]
        end
        R --> MC & MCat & MI & MP & MPa & MN
        MP --> MI
        MP --> MPa
        MP --> MN
        MP --> MCat
    end
    BD[(PostgreSQL única<br/>totes les taules)]
    Client --> R
    MC & MCat & MI & MP & MPa & MN --> BD

Tot viu al mateix rectangle. Les fletxes entre mòduls són crides a funcions. Tots els mòduls apunten a la mateixa base de dades.

La mateixa botiga en microserveis (punt d'arribada del curs)

flowchart TB
    Client[Navegador / App mòbil]
    GW[API Gateway :8080]
    Client --> GW

    subgraph Serveis
        CLI[servei-clients :3004]
        CAT[servei-cataleg :3001]
        INV[servei-inventari :3006]
        COM[servei-comandes :3002]
        PAG[servei-pagaments :3003]
        NOT[servei-notificacions :3005]
    end

    BDC[(PG clients)]
    BDCat[(MongoDB catàleg)]
    BDI[(PG inventari)]
    BDP[(PG comandes)]
    BDPa[(PG pagaments)]
    MQ[(RabbitMQ)]

    GW --> CLI & CAT & COM
    CLI --> BDC
    CAT --> BDCat
    INV --> BDI
    COM --> BDP
    PAG --> BDPa
    COM -. esdeveniments .-> MQ
    MQ -. esdeveniments .-> INV & PAG & NOT

Cada servei té el seu propi rectangle i la seva pròpia base de dades. Les relacions entre serveis passen per la xarxa (HTTP o RabbitMQ). El gateway és l'únic punt de contacte amb l'exterior.

  1. Un mateix canvi, dos cicles de vida: cupons de descompte a TechCorp

Res no il·lustra millor les diferències que seguir un canvi real. La Marta demana una funcionalitat nova: cupons de descompte. Un client introdueix un codi en fer la comanda, el sistema valida el cupó, aplica el descompte al total i registra que el cupó s'ha fet servir. A més, s'ha de poder consultar al catàleg quins productes admeten cupó i enviar un correu diferent quan la comanda porta descompte.

5.1 Al monòlit

Pas Què passa
1. Disseny Un desenvolupador (o dos) dissenya la taula cupons i decideix on va la lògica. Com que tot és al mateix codi, pot tocar el que vulgui.
2. Base de dades Afegeix una migració: taula cupons (codi, descompte, data de caducitat, usat) i una columna cupo_id a comandes. Una sola migració, una sola base de dades.
3. Codi Modifica crearComanda perquè rebi codiCupo, fa un SELECT sobre cupons, valida, aplica el descompte i marca el cupó com a usat dins de la mateixa transacció que crea la comanda. Modifica la consulta del catàleg perquè inclogui admet_cupo. Modifica la plantilla de correu.
4. Proves Arrenca l'aplicació sencera en local, crea una comanda amb cupó i comprova de cap a cap. Les proves automatitzades de tota l'aplicació triguen 25 minuts perquè són moltes.
5. Coordinació Tot i que el canvi el fa una persona, toca les àrees de comandes, catàleg i notificacions. Els responsables d'aquestes àrees revisen el pull request; de vegades hi ha conflictes amb altres canvis en curs sobre els mateixos fitxers.
6. Desplegament El canvi entra al desplegament setmanal del divendres juntament amb tota la resta. Es desplega l'aplicació completa. Si alguna cosa falla en qualsevol altra part, es reverteix tot, cupons inclosos.
7. Operació Si el càlcul del descompte té un error, es busca a l'únic log i es corregeix per al divendres següent (o es fa un desplegament d'urgència de tota l'aplicació).

Balanç: desenvolupament ràpid i senzill (una transacció, un repositori, un desplegament), però amb dependència del calendari global de desplegament, risc de trepitjar-se amb altres canvis i un desplegament que ho arrossega tot.

5.2 En microserveis

Pas Què passa
1. Disseny Primera pregunta: de qui és la capacitat "cupons"? És un servei nou (servei-promocions) o forma part de servei-comandes? Suposem que l'equip decideix que és un servei nou, perquè màrqueting voldrà gestionar campanyes. Cal definir-ne l'API (GET /cupons/{codi}, POST /cupons/{codi}/bescanvis) i els esdeveniments.
2. Base de dades servei-promocions crea la seva pròpia base de dades amb la taula cupons. servei-comandes afegeix cupoAplicat al seu propi esquema. Dues migracions, en dues bases de dades, sense transacció comuna.
3. Codi servei-comandes canvia crearComanda per cridar per HTTP servei-promocions i validar el cupó, aplicar el descompte i, un cop creada la comanda, demanar-ne el bescanvi. Cal decidir què passa si promocions no respon (es rebutja la comanda? s'ignora el cupó?). servei-cataleg afegeix admetCupo al seu document i a la seva API. servei-notificacions escolta comanda.confirmada, que ara inclou descompteAplicat, i tria la plantilla adequada.
4. Contractes L'API de servei-cataleg i l'esdeveniment comanda.confirmada canvien: cal fer-ho de manera compatible cap enrere (afegir camps, no treure'n) perquè els consumidors no actualitzats no es trenquin.
5. Proves Cada servei prova el que és seu en segons. A més, proves de contracte entre comandes i promocions i una prova d'integració amb els serveis implicats aixecats junts.
6. Coordinació Hi participen tres o quatre equips, però cadascun treballa al seu servei. La coordinació és sobre contractes, no sobre codi: "quins camps retorna GET /cupons/{codi}?"
7. Desplegament Primer es desplega servei-promocions (nou, no trenca res). Després catàleg i notificacions (canvis compatibles). Finalment comandes, que activa la funcionalitat. Cada desplegament és petit i independent i es pot fer qualsevol dia.
8. Operació Si el descompte es calcula malament, es corregeix i es redesplega només servei-comandes en minuts. Si l'error és "el cupó s'ha marcat com a usat però la comanda no s'ha creat", cal revisar la traça entre dos serveis i potser afegir una compensació.

Balanç: més feina inicial (definir servei, API, contractes, gestió de fallades), però desplegaments independents, equips que no es trepitgen i una capacitat de negoci (promocions) que neix ja aïllada i podrà evolucionar sola.

5.3 El que ensenya el recorregut

flowchart LR
    subgraph Monòlit
        A1[Disseny ràpid] --> A2[Una migració] --> A3[Un PR gran] --> A4[Proves lentes] --> A5[Desplegament setmanal de tot]
    end
    subgraph Microserveis
        B1[Disseny: de qui és?] --> B2[Definir contractes] --> B3[Diversos PR petits] --> B4[Proves ràpides + contracte] --> B5[Desplegaments independents]
    end
  • El monòlit optimitza el desenvolupament del canvi; els microserveis optimitzen el lliurament i l'evolució independent.
  • Al monòlit la dificultat apareix al final (coordinar el desplegament, revertir-ho tot). En microserveis apareix al principi (decidir límits i contractes).
  • La gestió de fallades, que al monòlit la resol la transacció, en microserveis és una decisió explícita de disseny.

  1. Altres alternatives: SOA i monòlit modular com a destinació

L'elecció no és binària. Entre "un monòlit" i "dotzenes de microserveis" hi ha parades intermèdies vàlides:

  • Monòlit modular (vist a l'apartat 2): mateix desplegament, límits interns rigorosos. Moltes organitzacions haurien d'aspirar a això i quedar-s'hi. És també la base ideal per a una futura extracció de serveis.
  • SOA "clàssica": serveis de gra més gruixut que els microserveis, sovint amb un bus d'integració. Encara és comuna a grans corporacions. Comparteix amb els microserveis la idea de serveis, però amb més centralització (vegeu la lliçó 01-01).
  • Pocs serveis grans ("macroserveis"): dividir el sistema en dues o tres peces per raons molt concretes (per exemple, separar el catàleg d'alta lectura de la resta) sense anar més enllà. És una estratègia pragmàtica que captura part dels avantatges amb una fracció del cost.

Cap d'aquestes opcions no és "fer trampes". Són punts diferents d'un mateix espectre, i el raonable és triar el que respongui als problemes reals que es tenen.

  1. El mite que el monòlit és sempre dolent

Convé dir-ho amb claredat, perquè la indústria de vegades ho oblida: el monòlit no és un error d'arquitectura. És l'opció per defecte correcta per a la majoria de projectes nous i per a molts sistemes madurs. Els seus avantatges són reals:

  • Es comença a lliurar valor en dies, no en mesos d'infraestructura.
  • Un desenvolupador pot entendre i executar tot el sistema al seu portàtil.
  • Les transaccions i els JOIN resolen gratis problemes que en microserveis costen patrons complexos.
  • Refactoritzar és fàcil perquè el compilador o les proves veuen tot el codi alhora; moure una responsabilitat d'un mòdul a un altre és canviar un import, no renegociar un contracte entre equips.
  • Operar-lo és barat: un procés, una base de dades, un log.

Empreses grans i molt respectades operen monòlits enormes amb èxit, i d'altres que van migrar a microserveis han tornat parcialment a consolidar serveis perquè el cost operatiu no compensava. Els microserveis no fan bo un sistema; resolen un conjunt concret de problemes (escalat desigual, equips que es destorben, cicles de desplegament lents) a canvi d'un altre conjunt de problemes. Si no tens els primers, no compris els segons.

El cas de TechCorp que seguim al curs està triat precisament perquè sí que té aquests problemes: campanyes que saturen només el catàleg, desplegaments setmanals amb por, equips que es trepitgen al mateix codi. Per això la seva història és una història de migració. Però un TechCorp de quatre persones i mil comandes al mes s'hauria de quedar al seu monòlit, idealment modular, i ser feliç.

Errors Comuns i Consells

  • Confondre monòlit amb codi dolent. Un monòlit pot estar impecablement organitzat. Si el problema és que el codi és un caos, la solució és refactoritzar cap a un monòlit modular, no repartir el caos per la xarxa.
  • Comparar un monòlit real amb uns microserveis idealitzats. És fàcil guanyar el debat si es compara el monòlit heretat ple de deute tècnic amb un diagrama net de serveis. Compara amb la mateixa honestedat: els microserveis també acumulen deute, només que distribuït.
  • Oblidar el cost inicial. La taula comparativa mostra que els microserveis paguen per endavant. Si el projecte necessita lliurar valor en setmanes, aquest cost pot ser prohibitiu.
  • Pensar que les transaccions "se substitueixen" sense més. El pas d'"una transacció que ho fa tot" a "diversos serveis sense transacció comuna" és la part més difícil de la comparació i mereix la màxima atenció en el disseny.
  • Consell: en avaluar un canvi funcional, fes l'exercici de l'apartat 5 mentalment: recorre els passos en la teva arquitectura actual i en l'alternativa. És la manera més ràpida de detectar on són els costos reals.

Exercicis

Exercici 1: Classificar arquitectures

Per a cada descripció, indica si es tracta d'un monòlit clàssic, un monòlit modular o microserveis, i justifica-ho amb la taula de l'apartat 2.

  1. Una aplicació Node.js en un únic repositori, dividida en carpetes clients/, cataleg/, comandes/, cadascuna amb el seu propi conjunt de taules a què les altres carpetes només accedeixen a través de funcions públiques del mòdul; es desplega com un únic procés.
  2. Sis processos Node.js independents, cadascun amb la seva base de dades, que es comuniquen per HTTP i RabbitMQ i es despleguen per separat.
  3. Una aplicació Java desplegada com un únic fitxer .war en què qualsevol classe pot executar consultes SQL sobre qualsevol taula.

Exercici 2: Recórrer un canvi

La Marta demana una altra funcionalitat: llista de desitjos (un client pot desar productes per a més endavant i rebre un correu si baixen de preu). Descriu, en format de llista de passos com a l'apartat 5, com s'implementaria al monòlit actual de TechCorp i a la versió de microserveis. Assenyala en cadascun el pas més costós.

Exercici 3: Defensar el monòlit

Un company afirma: "Els monòlits són cosa del passat; qualsevol projecte seriós avui hauria de començar amb microserveis". Escriu tres arguments, recolzats en la taula de l'apartat 3, per rebatre'l.

Solucions

Exercici 1

  1. Monòlit modular. Una unitat de desplegament, però amb límits explícits entre mòduls i dades "privades" per mòdul. És exactament el punt intermedi descrit.
  2. Microserveis. Diverses unitats de desplegament, base de dades per servei, comunicació per xarxa.
  3. Monòlit clàssic (i probablement amb tendència a bola de fang). Una unitat de desplegament i accés indiscriminat a les dades.

Exercici 2 (una solució possible)

Monòlit:

  1. Migració: taula llista_desitjos (client_id, producte_id, preu_en_el_moment).
  2. Endpoints a les rutes de clients per afegir i llistar desitjos, amb un JOIN a productes per mostrar nom i preu actual.
  3. En actualitzar el preu d'un producte (mòdul de catàleg), consultar llista_desitjos i cridar la funció de notificacions per enviar el correu, tot al mateix procés.
  4. Proves de l'aplicació completa; desplegament setmanal. Pas més costós: el desplegament conjunt i les proves lentes; el desenvolupament en si és senzill.

Microserveis:

  1. Decidir on viu la llista de desitjos: probablement a servei-clients (és una preferència del client).
  2. servei-clients afegeix la seva taula i els seus endpoints; per mostrar nom i preu actual ha de cridar servei-cataleg o desar una còpia local actualitzada per esdeveniments.
  3. servei-cataleg publica un esdeveniment producte.preu-canviat; servei-clients el consumeix, busca qui tenia aquest producte a la seva llista i publica alguna cosa com desig.baixada-preu; servei-notificacions el consumeix i envia el correu.
  4. Contractes: definir els dos esdeveniments nous i els seus camps.
  5. Desplegaments independents de catàleg, clients i notificacions, en aquest ordre. Pas més costós: decidir com obté clients les dades del producte (crida síncrona enfront de còpia per esdeveniments) i dissenyar la cadena d'esdeveniments; cal pensar en fallades i duplicats.

Exercici 3 (arguments possibles)

  • Cost inicial: un monòlit lliura valor en dies amb un servidor i una base de dades; els microserveis exigeixen contenidors, orquestració, missatgeria i observabilitat abans de la primera funcionalitat. Per a un projecte nou, el risc més gran del qual és no trobar mercat, aquest cost és difícil de justificar.
  • Dades i rendiment: en un monòlit, una transacció i un JOIN resolen problemes que en microserveis requereixen sagues, duplicació de dades i crides per xarxa amb latència. Mentre el domini no estigui clar, aquesta simplicitat val or.
  • Equips: els avantatges d'autonomia dels microserveis només apareixen quan hi ha diversos equips que es destorben. Amb un únic equip petit no hi ha a qui deixar de destorbar, i sí que hi ha molts més serveis a operar. A més, un monòlit modular ofereix límits clars sense cost de xarxa i deixa oberta la porta a extreure serveis més endavant.

Conclusió

En aquesta lliçó hem definit el monòlit com una única unitat de desplegament amb una base de dades compartida i crides internes en memòria, i hem presentat el monòlit modular com una variant disciplinada que combina la senzillesa operativa del monòlit amb límits interns clars. La comparació dimensió a dimensió ha mostrat un patró consistent: el monòlit és barat i simple al principi i es complica en créixer, mentre que els microserveis paguen un cost inicial alt a canvi de mantenir acotada la complexitat de cada peça i permetre desplegaments, escalat i equips independents. El recorregut del canvi "cupons de descompte" ha fet tangible on apareixen les dificultats en cada cas: al final del cicle al monòlit, al principi als microserveis. I hem deixat clar que el monòlit no és una arquitectura de segona: és l'opció correcta per a molts sistemes.

Amb aquesta comparació a la mà, ja podem abordar la pregunta que de debò importa a la pràctica: quan convé adoptar microserveis i quan no? La lliçó següent dona criteris concrets, senyals d'alarma, prerequisits i una llista de comprovació per prendre aquesta decisió amb fonament.

Curs de Microserveis

Mòdul 1: Introducció als Microserveis

Mòdul 2: Disseny de Microserveis

Mòdul 3: Comunicació entre Microserveis

Mòdul 4: Implementació de Microserveis

Mòdul 5: Desplegament i Orquestració

Mòdul 6: Monitoratge i Manteniment

Mòdul 7: Seguretat en Microserveis

Mòdul 8: Casos d'Estudi i Exemples Pràctics

© Copyright 2026. Tots els drets reservats