Microservizi: MonolithFirst?


9

Ho studiato architetture di microservizi cercando di ottenere una panoramica di alto livello di tutti i pro e i contro, perché e perché, molte informazioni che sto leggendo / guardando provengono da ThoughtWorks (Martin Fowler, Neal Ford, et al).

La maggior parte del lavoro di Martin Fowler sull'argomento ha pochi anni, quando Microservices (come nome familiare nella programmazione, se non in medicina generale) era ancora giovane, quindi ne prendo gran parte con un granello di sale.

Una cosa in particolare è questa:

Mentre ascolto storie di team che usano un'architettura di microservizi, ho notato uno schema comune.

  • Quasi tutte le storie di successo del microservizio sono iniziate con un monolite che è diventato troppo grande e rotto
  • Quasi tutti i casi in cui ho sentito parlare di un sistema che è stato costruito da zero come un sistema di microservizi, è finito in guai seri.

Questo schema ha portato molti dei miei colleghi a sostenere che non dovresti iniziare un nuovo progetto con microservizi, anche se sei sicuro che la tua applicazione sarà abbastanza grande da renderlo utile. .

(rif: https://martinfowler.com/bliki/MonolithFirst.html - enfatizza la loro)

Ora, 3 anni dopo e con i microservizi un termine più onnipresente, è generalmente piacevole che un nuovo sistema sia in genere meglio servito da blocchi di servizio più grandi (-hanno microservizio-ma-più piccolo del monolito) per iniziare e fare loro più granulari come parte di una misura evolutiva?

Oppure, c'è una norma per iniziare un progetto da zero con un'architettura granulare a microservizi, in contrasto con le affermazioni sopra?

Sembra un approccio generale sano, ma curioso dei pensieri della comunità.

Risposte:


2

Se la tua azienda ha fatto microservizi per un po ', alcuni pezzi potrebbero già essere stati costruiti e devi semplicemente incorporarli. Probabili esempi potrebbero essere l'autenticazione come servizio o l'archiviazione di dati BLOB. In tal caso, hai già definito i limiti e stai riutilizzando il codice in una nuova applicazione. È una buona cosa.

Per il nuovo codice in cui non si è sicuri di dove debba essere il confine, crearlo in un servizio. Se lo mantieni modulare, puoi dividere i microservizi da esso, se necessario. Soprattutto quando trovi parti del tuo servizio che devono essere ridimensionate diversamente dalle altre.

Il vantaggio dei microservizi è che è possibile aggiungere istanze per ridimensionare il lavoro svolto su richiesta. Se alcuni dei tuoi lavori arrivano a raffica, potrebbe essere logico separarli nel proprio microservizio.

In generale:

  • Se hai già creato microservizi, riutilizzali
  • Se stai costruendo qualcosa di nuovo, fai funzionare prima l'idea
  • Durante la costruzione, cerca di mantenere le cose modulari in modo che alcuni servizi possano essere facilmente risolti
  • Mentre stai costruendo, se una parte del tuo servizio deve essere in grado di scalare su richiesta a un ritmo diverso, separalo nel proprio servizio

Troppo spesso sentiamo utili linee guida da persone intelligenti con una buona reputazione come Martin Fowler, e poi lo trasformiamo in una dura dottrina da cui non si può in alcun modo influenzare.

Devi prendere dichiarazioni del genere nello spirito del loro significato. Martin Fowler sta cercando di salvare le persone dalla paralisi mediante analisi e di dire loro di costruire qualcosa che funzioni per primo. Puoi sempre separarlo in seguito, quando sai di più su come funziona davvero la tua applicazione.


13

I vantaggi più preziosi dei microservizi possono essere ottenuti con una semplice modularizzazione del codice. Puoi isolare gruppi di funzionalità in moduli usando qualunque sistema di moduli tu abbia (maven, npm, nuget, qualunque cosa). Ogni modulo può servire a un unico scopo, gestire il proprio repository, utilizzare il proprio schema DB, gestire la propria configurazione, disporre del proprio backlog di funzionalità e pianificazione delle versioni. Possono ancora essere schierati insieme su un monolite. Questa è una quantità molto gestibile di spese generali e offre alcuni buoni benefici. Il sovraccarico maggiore deriva dalla separazione delle distribuzioni che è davvero preziosa solo quando si ha una scala sufficiente per renderla necessaria. Se il tuo codice è già modulare, al momento sarà una migrazione più semplice.


Sembra che una buona prassi di codifica generale sia combinata con un po 'di gestione della base di codice migliorata, ma non è all'altezza del percorso "non è necessario aggiornare l'intero monolito su un aggiornamento di servizio minore", che è dove mi aspetto che i microservizi tendano brillare. In ogni caso, un buon consiglio, grazie.
jleach,

1
Completamente d'accordo con la risposta. Un monolite ben costruito e correttamente modulare offre la maggior parte (anche se non tutti) i vantaggi dei microservizi. D'altro canto, i microservizi presentano alcuni problemi piuttosto grandi.
Milos Mrdovic,

@jleach Una qualità di buona modularizzazione è l'implementazione indipendente. Se devi ricompilare e ridistribuire l'intero monolito per fare un aggiornamento minore del modulo, stai facendo qualcosa di sbagliato.
Milos Mrdovic,

2
Questo è un buon approccio. Non creare un microservizio per il bene di fare microservizio. L'architettura dei microservizi dovrebbe essere utilizzata per risolvere i problemi, ma presentano anche una serie di problemi propri, quindi se non si è pronti / consapevoli di tali compromessi, si dovrebbe fare molta attenzione a sviluppare microservizi da zero.
Lie Ryan,

1
@MilosMrdovic, anche con l'approccio del modulo, puoi comunque ottenere un po 'di efficienza nella distribuzione poiché non è necessario ripetere il test dell'intero monolito, ma solo del modulo che stai aggiornando. Se il tuo modulo supera tutte le porte di qualità, puoi costruirlo e spedirlo. Quindi il tuo monolito deve solo aggiornare la sua versione di dipendenza e ridistribuirla. Non dovrai ricostruire altri moduli.
jiggy,

2

A mio avviso, può essere utile sviluppare prima un monolito (o meglio: sviluppare parti della tua applicazione come monolito).

Ci sono casi in cui non sei sicuro del dominio e dei limiti del tuo problema (ad esempio, costruisco un sito di gestione della nave, ho bisogno di un servizio di nave E un servizio di flotta o è un servizio di nave sufficiente?), E in questi casi un il monolito può essere più facile da sviluppare.

Dovresti smettere di farlo se hai bisogno di integrare tecnologie diverse nel mix (ad es. Le tue parti esistenti sono scritte in C #, ma il tuo nuovo problema richiede l'apprendimento automatico, con si fa meglio con Python), avere una buona conoscenza dei domini nel tuo progetto o il tuo monolito tratta di galvanizzare, ad esempio tutti costruiscono questo monolito e schiacciano il concetto di servizi separati.


1
"E in questi casi un microservizio può essere più facile da sviluppare" - intendevi parlare di monoliti lì?
amon,

@amon Grazie, ho corretto la frase - mio figlio mi ha interrotto 34235 volte, quindi ero confuso;)
Christian Sauer,

Mentre sono d'accordo con la tua prima frase, penso che dovresti considerare che anche il tuo monolite dovrebbe già essere "modulare" all'interno, altrimenti non sarai in grado di separare nulla senza far cadere tutto.
Walfrat,

@Walfrat Tendo ad essere d'accordo, ma la tentazione di riutilizzare il codice esistente è molto più grande (e meno facilmente schiacciata) in un monolite. Ad esempio "oh guarda, qualcuno ha definito un WidgetId, lo userò semplicemente per il mio FormId": Inoltre, non puoi facilmente usare un'altra lingua / db per un progetto, il che promuove davvero il pensiero "tutti devono usare strumenti comuni"
Christian Sauer

1

Sono abbastanza sicuro che ci siano state un paio di domande su questo esatto articolo di MF.

La mia opinione è questa:

Un monolite con problemi di manutenzione o scalabilità viene migliorato suddividendolo in microservizi. Un tale progetto avrà quasi sempre "successo", poiché anche la suddivisione di una piccola sezione può comportare guadagni misurabili e puoi tracciare una linea sotto di essa quando sei felice.

Se il tuo mezzo monolito + una coda di messaggi e un paio di processi di lavoro contano come "Architettura di microservizi" è un argomento da tenere giù per il pub, ma sicuramente lo chiamerai così quando parlerai del progetto.

D'altra parte, qualsiasi nuovo progetto, indipendentemente dall'architettura scelta, corre il rischio di non soddisfare le aspettative, quindi naturalmente ti aspetteresti un tasso di successo inferiore. Inoltre, se hai iniziato con l'obiettivo di rendere l'intero progetto "Best Practice Microservice Architecture" da zero, potresti avventurarti in nuove tecnologie e nei bit più difficili dei microservizi.

Inoltre, dobbiamo ricordare che MF scrive da una grande prospettiva OOP. È naturalmente scettico su un approccio distribuito più moderno.

Al giorno d'oggi mi aspetterei che qualsiasi soluzione aziendale di grandi dimensioni includa un elemento di microservizi e solo un pazzo ti consiglierebbe di creare un'applicazione monolite gigante a meno che non si stia distribuendo un'unica applicazione in stile desktop.


Grazie. Se la MF tende ad essere leggermente distorta, c'è qualcuno il cui lavoro posso studiare dalla parte opposta per aiutare ad acquisire profondità di prospettiva?
jleach,

Non consiglierei le "celebrità del web" come risorsa di apprendimento. Va bene per alcuni aneddoti e un discorso divertente, ma nella mia esperienza è il dettaglio che fa la differenza tra successo e fallimento.
Ewan,

0

Nella mia (vasta) esperienza ho visto molti più progetti fallire a causa di problemi di persone piuttosto che di problemi tecnologici. Sfortunatamente, alla gente non piace fallire e quindi tendono a riportare erroneamente le ragioni del fallimento e incolpare la tecnologia.

Nel mio dominio, finanza, oggigiorno la maggior parte dei nuovi progetti segue architetture di microservizi e sembra essere un'architettura vincente dal punto di vista del TCO (costo totale di proprietà). Questi progetti non sembrano fallire così spesso e quando lo fanno i motivi indicati non elencano spesso l'architettura dell'applicazione come problema.


I microservizi in realtà risolvono molti problemi organizzativi. Se ogni servizio ha un proprietario, allora sai come soffocare quando qualcosa non funziona.
jiggy,

@jiggy: se il codice è ben modulare, non è necessario dividerlo in più servizi per sapere chi soffocare.
Lie Ryan,

@Ryan, se qualcuno pensa che i microservizi e la modularizzazione siano sinonimi, hanno perso del tutto il punto.
Software Engineer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.