ABONAMENTE VIDEO REDACȚIA
RO
EN
Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 145
Abonament PDF

O arhitectură optimă: Monoliți modulari

Mircea Girigan
Software Engineer @ BoatyardX



PROGRAMARE


În ultimii ani, arhitecturile software au evoluat rapid, reflectând nevoile în schimbare ale dezvoltatorilor de soft și ale mediului de afaceri. Cu toate că trecerea de la monolitele tradiționale la microservicii a adus numeroase beneficii, susținătorii lor spun că utilizarea acestora implică un cost semnificativ, ele fiind utile doar în contextul unui sistem foarte complex.

În mod tradițional, "application frameworks" au oferit îndrumări structurale, cum ar fi adnotările din Spring Framework (@Controller, @Service, @Repository). Dar, în ultimul timp, s-a făcut trecerea la o paradigmă în care este recomandat ca structura codului să fie cât mai aliniată cu domeniul problemei pe care aplicația o rezolvă, observându-se că acest lucru duce la aplicații mai bine structurate, care sunt mai ușor de înțeles și de întreținut.

Sistemele bazate pe microservicii au devenit omniprezente în ultimii ani. Cu toate acestea, sistemele monolitice, modulare și-au recăpătat popularitatea recent.

"You shouldn't start a new project with microservices, even if you're sure your application will be big enough to make it worthwhile." (Martin Fowler, 2015).

În acest context, conceptul de "modular monoliths" a apărut ca o soluție intermediară care combină simplitatea și coerența monolitului cu structura și organizarea modulară. În acest articol, vom explora ceea ce este un monolit modular, avantaje și dezavantaje. Totodată, vom aborda scenariile în care această arhitectură poate fi considerată optimă.

Ce sunt monolitele modulare?

Definiția monolitului modular

Un monolit modular este o abordare arhitecturală în care o aplicație este dezvoltată ca un singur artefact, dar este împărțită în module distincte și autonome, menținând în același timp un singur cod sursă și un singur "deployment". Fiecare modul are responsabilități clare, fiind dezvoltat, testat și menținut independent de celelalte module. Aceasta permite echipelor să păstreze avantajele unui monolit tradițional, cum ar fi simplitatea gestionării versiunilor, în timp ce beneficiază de o structură modulară care facilitează organizarea, scalabilitatea și mentenabilitatea aplicației.

Caracteristici Cheie

  1. Separarea responsabilităților: Fiecare modul are o responsabilitate bine definită și este izolat de celelalte module.

  2. Interfețe bine definite: Modulele comunică între ele prin interfețe clar definite, reducând astfel dependențele strânse.

  3. Dezvoltare independentă: Fiecare modul poate fi dezvoltat și testat separat, permițând echipelor să lucreze în paralel fără a interfera una cu cealaltă.

  4. Un singur artefact: Toate modulele sunt combinate într-un singur artefact, simplificând procesul de "deployment" și monitorizare.

Avantajele monolitelor modulare

Simplitatea implementării și desfășurării

Monolitele modulare permit instalarea într-un mediu de producție a unui singur artefact, reducând astfel complexitatea infrastructurii. Acest lucru este benefic în special pentru echipele mici sau pentru organizațiile care nu doresc să gestioneze complexitatea unei arhitecturi de microservicii.

Consistență și întreținere

Gestionarea unui singur cod sursă facilitează aplicarea actualizărilor și menținerea coerenței. Dat fiind că toate modulele sunt parte a aceleași aplicații, sincronizarea și compatibilitatea între module sunt garantate.

Performanță și eficiență

Monolitele modulare pot oferi performanțe superioare, evitând latențele de rețea asociate cu comunicarea între microservicii. De asemenea, coerența datelor este mai ușor de asigurat într-o arhitectură monolitică.

Gestionarea dependențelor

Dependențele între module sunt mai ușor de gestionat, deoarece toate sunt parte a aceluiaşi artefact. Acest lucru reduce riscul de incompatibilități și facilitează refactorizarea.

Dezavantajele monolitelor modulare

Limitări în scalabilitate

Deși monolitele modulare oferă un grad de scalabilitate, ele nu pot atinge flexibilitatea și granularitatea oferite de microservicii. Pentru aplicațiile care necesită scalabilitate independentă a componentelor, monolitul modular poate deveni o constrângere.

Complexitatea managementului codului

Pe măsură ce aplicația crește, gestionarea unei baze mari de cod poate deveni complicată. Necesită o disciplină strictă în dezvoltare și o structură clar definită a modulelor pentru a evita "codul spaghetti".

Restricții în tehnologii și limbaje

Toate modulele dintr-un monolit modular trebuie să fie dezvoltate folosind aceleași tehnologii și limbaje de programare, ceea ce poate limita flexibilitatea echipelor de a alege cele mai potrivite instrumente pentru fiecare componentă.

Timp de dezvoltare și implementare

Deși modular monoliths pot reduce timpul de dezvoltare inițial, pe termen lung, gestionarea și implementarea actualizărilor poate deveni mai consumatoare de timp, mai ales dacă modulele nu sunt bine izolate.

Când ar trebui să implementăm un monolit modular?

Proiecte de dimensiuni mici sau medii

Pentru aplicațiile de dimensiuni mici sau medii, unde complexitatea și volumul de cod nu justifică complexitatea infrastructurii necesare pentru a avea microservicii, monolitul modular este o alegere ideală. Aceasta permite o dezvoltare rapidă și o desfășurare simplificată.

Echipe de dezvoltare mici

Echipele de dezvoltare mici pot beneficia de pe urma monolitului modular, deoarece simplifică coordonarea și colaborarea. Evitând necesitatea gestionării unui ecosistem distribuit, echipele pot lucra mai eficient.

Proiecte cu evoluție rapidă

În fazele incipiente ale dezvoltării unui produs, unde cerințele sunt în continuă schimbare, monolitul modular permite o adaptare rapidă și iterativă, fără a introduce complexitatea suplimentară a microserviciilor. Acesta oferă o bază solidă care poate fi ulterior scalată și refactorizată pe măsură ce aplicația evoluează.

Sisteme cu necesități ridicate de performanță

Pentru aplicațiile care necesită performanțe înalte și o latență redusă, monolitul modular poate oferi o soluție mai eficientă în comparație cu arhitecturile distribuite. Latențele de rețea sunt reduse, iar coerența datelor este mai ușor de gestionat într-o singură aplicație.

Implementare - Spring Modulith

Spring Modulith

Spring Modulith este un proiect de la Spring, în opinia mea al doilea ca importanță după Spring Boot, care sprijină dezvoltatorii de programe în construirea aplicațiilor monolitice modulare. Acesta ajută la structurarea codului în jurul unor domenii, făcându-l mai ușor de gestionat și evoluat.

Modulele aplicației

Putem considera modulele de domeniu sau de business ale aplicației noastre ca sub-pachete directe ale pachetului principal al aplicației. Într-o aplicație Spring Boot, un modul este o unitate de funcționalitate care constă în următoarele părți:

Verificarea structurii aplicației

Putem folosi metoda verify() din ApplicationModules pentru a identifica dacă modularitatea codului nostru respectă constrângerile intenționate. Spring Modulith utilizează proiectul ArchUnit pentru a oferi această capacitate.

@Test
void verifiesModularStructure() {
    ApplicationModules modules = ApplicationModules.of(Application.class);
    modules.verify();
}

Documentarea modulelor

Putem documenta relațiile dintre modulele unui proiect. Spring Modulith oferă generarea de diagrame bazate pe PlantUML.

@Test
void createModuleDocumentation() {
    ApplicationModules modules = ApplicationModules.of(Application.class);
    new Documenter(modules)
      .writeDocumentation()
      .writeIndividualModulesAsPlantUml();
}

Concluzie

Monolitele modulare reprezintă o abordare echilibrată în arhitectura software, combinând simplitatea și eficiența monolitului tradițional cu beneficiile organizatorice ale microserviciilor. În contextul potrivit, ele pot oferi o soluție optimă pentru dezvoltarea și scalarea aplicațiilor, permițând echipelor să se concentreze pe livrarea rapidă a funcționalităților fără a sacrifica performanța sau flexibilitatea internă. Deși nu sunt o soluție universală, monolitele modulare merită luate în considerare pentru proiectele care se încadrează în scenariile discutate, oferind un compromis viabil între structura monolitică și complexitatea microserviciilor.

Această abordare acordă echipelor de dezvoltare o modalitate eficientă de a gestiona complexitatea aplicațiilor pe măsură ce acestea evoluează, asigurând în același timp că performanța și întreținerea rămân gestionabile. Monolitele modulare reprezintă, așadar, un pas important în evoluția arhitecturilor software, oferind un echilibru binevenit între tradiție și inovație.

Referințe

  1. "Modular Monolith: A Primer", Simon Brown, 2019.

  2. Microservices For Greenfield? , Sam Newman, 2015

  3. "MonolithFirst", Martin Fowler, 2015.

  4. "Microservices vs. Monoliths: The Case for a Symbiotic Design", Mark Richards, 2016.x

LANSAREA NUMĂRULUI 149

Marți, 26 Octombrie, ora 18:00

sediul Cognizant

Facebook Meetup StreamEvent YouTube

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects