In che modo il passaggio ai microservizi crea un problema di runtime?


104

Il seguente commentatore scrive :

I microservizi spostano la disfunzione organizzativa da un problema di compilazione a un problema di runtime.

Questo commentatore si espande sul problema dicendo:

Funzionalità non bug. Problema di runtime => prod problemi => feedback più forte e più rapido sulla disfunzione per i responsabili

Ora lo capisco con i microservizi :

  • aumentare potenzialmente la latenza del through-put, che è un problema di produzione e di runtime.
  • aumentare il numero di "interfacce di rete" nel codice in cui potrebbero esserci potenziali errori di runtime dell'analisi.
  • può potenzialmente fare distribuzioni blu-verdi. Questi potrebbero essere ostacolati da disallineamenti dell'interfaccia (vedi interfacce di rete). Ma se le distribuzioni blu-verdi funzionano, è più una preoccupazione di runtime.

La mia domanda è: cosa significa che il passaggio ai microservizi crea un problema di runtime?


13
Se A parla con B in un monolito almeno l'interfaccia effettiva può essere dimostrata compatibile (attraverso la digitazione statica) che rende più probabile che sia anche corretta. Di solito i microservizi comunicano su qualcosa senza tali controlli del tempo di compilazione
Richard Tingle,

Se stai studiando i problemi legati all'uso dei microservizi, l'articolo di Fowler è assolutamente da leggere. martinfowler.com/articles/microservices.html Credo che non sia solo un caso di tempo di compilazione vs runtime, come ha detto @Richard Tingle. E non sono davvero d'accordo sul fatto che avere un problema di produzione sia migliore di quello in fase di sviluppo. Ma i microservizi possono aiutare a scalare grandi progetti in altri modi. (E sono eccessivi per la maggior parte dei piccoli progetti)
Borjab il

2
Quel commentatore è miope. Problema di runtime => prod problemi => utenti insoddisfatti => soldi persi.
Philipp

@Philipp: questo è il punto. Compilare i problemi di tempo causati da disfunzione organizzativa => non importa a nessuno. La perdita di denaro causata dalla disfunzione organizzativa => fa male esattamente a chi è responsabile di tale disfunzione organizzativa. La speranza: la disfunzione organizzativa viene risolta più rapidamente.
Jörg W Mittag,

Risposte:


194

Ho un problema. Usiamo i microservizi! Ora ho 13 problemi distribuiti.

Dividere il sistema in componenti incapsulati, coesivi e disaccoppiati è una buona idea. Ti consente di affrontare diversi problemi separatamente. Ma puoi farlo perfettamente in una distribuzione monolitica (vedi Fowler: Microservice Premium ). Dopo tutto, questo è ciò che OOP ha insegnato per molti decenni! Se decidi di trasformare i tuoi componenti in microservizi, non otterrai alcun vantaggio architettonico. Ottieni una certa flessibilità per quanto riguarda la scelta della tecnologia e possibilmente (ma non necessariamente!) Una certa scalabilità. Ma ti viene garantito un certo mal di testa derivante da (a) la natura distribuita del sistema e (b) la comunicazione tra i componenti. Scegliere i microservizi significa che hai altri problemi che sono così urgenti che sei disposto a usare i microservizi nonostante questi problemi.

Se non si è in grado di progettare un monolite suddiviso in modo chiaro in componenti, non sarà nemmeno possibile progettare un sistema di microservizi. In una base di codice monolitico, il dolore sarà abbastanza evidente. Idealmente, il codice semplicemente non si compila se è orribilmente rotto. Ma con i microservizi, ogni servizio può essere sviluppato separatamente, possibilmente anche in lingue diverse. Eventuali problemi nell'interazione dei componenti non diventeranno evidenti fino a quando non si integreranno i componenti e a quel punto è già troppo tardi per riparare l'architettura generale.

La prima fonte di bug è la mancata corrispondenza dell'interfaccia. Potrebbero esserci errori eclatanti come un parametro mancante o esempi più sottili come dimenticare di controllare un codice di errore o dimenticare di controllare un prerequisito prima di chiamare un metodo. La digitazione statica rileva tali problemi il più presto possibile: nell'IDE e nel compilatore, prima che il codice venga mai eseguito. I sistemi dinamici non hanno questo lusso. Non esploderà finché non verrà eseguito quel codice difettoso.

Le implicazioni per i microservizi sono terrificanti. I microservizi sono intrinsecamente dinamici. Se non si passa a un linguaggio di descrizione formale del servizio, non è possibile verificare alcun tipo di correttezza dell'utilizzo dell'interfaccia. devi testare, testare, testare! Ma i test sono costosi e di solito non esaustivi, il che lascia la possibilità che possano sussistere problemi nella produzione. Quando diventerà evidente questo problema? Solo quando viene intrapreso quel percorso difettoso, in fase di esecuzione, in produzione. L'idea che i problemi con i prodotti produrrebbe un feedback più rapido èesilarante pericolosamente sbagliato, a meno che tu non sia divertito dalla possibilità di perdita di dati.


13
@JacquesB Sono fiducioso che la "disfunzione organizzativa" si riferisca all'incapacità di sviluppare un sistema. La maggior parte della mia risposta è un contesto per illustrare come si potrebbe arrivare a una simile conclusione, ma è la mia opinione professionale e non presa dal tweet.
amon

10
"monolite che è nettamente diviso in componenti" - che diavolo significa?

10
E per non parlare del controllo delle versioni delle interfacce (le interfacce cambiano nel tempo).
Peter Mortensen,

12
@mobileink Monolith non è un termine ideale qui poiché suggerisce "nessuna architettura". Ma quello che sto cercando di trasmettere è un sistema sviluppato e distribuito come un singolo sistema, in contrasto con un'architettura orientata ai servizi in cui parti del sistema possono essere distribuite in modo indipendente. Si prega di modificare il post, se si conosce un termine migliore ...
amon

7
@amon Ascoltare la parola Monolith non evoca immediatamente l'idea di "nessuna architettura". La maggior parte degli edifici sono monoliti, così come le grandi piramidi d'Egitto e molti altri oggetti. Chiaramente furono progettati e consegnati nel loro insieme. Molti sistemi software mancano di una buona architettura; ma la mancanza di una buona architettura sembra essere indipendente dal modo in cui sono distribuiti. Puoi prendere in prestito parte dell'impalcatura di un altro progetto e chiamarla architettura (3-tier, 2-tier, n-tier, microservice, ecc.) Ma farlo non ti assicura di averlo fatto bene.
Edwin Buck,

215

Il primo tweet è stato il mio, quindi lo espanderò:

Supponiamo di avere 100 sviluppatori che lavorano su un'applicazione monolitica. Sono troppe le persone per comunicare in modo efficace tra loro, quindi la società deve lavorare sodo per dividerle in team più piccoli e creare buoni modelli di comunicazione tra di loro. Quando l'organizzazione è "disfunzionale", i team probabilmente non parlano tra loro, non sono allineati a un obiettivo più ampio, non sono d'accordo su priorità ecc. - Di conseguenza, impiegano un'eternità a spedire qualcosa. È un "problema di compilazione", nel senso che la disfunzione è evidente prima della produzione del software. Il progetto è probabilmente una marcia della morte o non verrà mai spedito ("compilare").

Penso che molte persone siano attratte dai micro servizi e si stiano muovendo verso di loro, non a causa dei vantaggi tecnici / architettonici intrinseci, ma perché consente loro di ignorare la disfunzione organizzativa. Invece di cercare di allineare 100 sviluppatori, sperano di poter avere piccoli team che lavorano in silos, ognuno focalizzato sul proprio piccolo micro servizio. Se fai parte di un'organizzazione così disfunzionale, questo è così attraente: ti dà un permesso molto maggiore per evitare le persone che non ti piacciono, per non comunicare.

Sfortunatamente diventa un "problema di runtime" perché una volta che il software è in produzione, una buona comunicazione diventa altrettanto importante. I problemi con l'organizzazione - i team e il modo in cui sono allineati e comunicano - si manifestano in "fase di esecuzione".

Il punto del mio tweet era: se quello che hai è un problema di persone , una nuova architettura non ti aiuterà. Ritarderà semplicemente gli effetti del problema. Penso che l'attrattiva dei micro-servizi per molte persone sia la speranza che risolva magicamente questi problemi.


67
+1. Questo è molto meglio come risposta di Stack Exchange che come tweet. :-)
ruakh

3
Lo stesso vale per qualsiasi sistema dinamico, davvero. La digitazione dinamica è molto utile, ma solo se hai le persone giuste. I "database a mano libera" sono molto utili, ma solo se hai le persone giuste. Se non hai le persone giuste, stai solo delegando i problemi, non risolverli.
Luaan,

2
Penso che questa sia una tautologia. Quando le persone sono il problema, i problemi possono manifestarsi ovunque. Non riesco a immaginare di spedire una soluzione in esecuzione come un insieme di microservizi senza test di integrazione adeguati. In tal caso, non è possibile spedire una soluzione con un flusso di lavoro supportato. Se qualcuno passa a microservizi senza test di flusso, in particolare per nascondere i problemi, è il problema. Potrebbe anche spedire binari non testati / rotti. Solleva il problema dai programmatori di livello trooper più in alto, a cui appartiene.
luk32,

10
@ luk32 In parte sì, ma l'essenza dei microservizi che lo rendono attraente per i team malvagi è che fai passare inosservata la tua abilità e deficit comunicativo per un periodo di tempo più lungo. Non si tratta di avere i problemi o meno, si tratta di quando si presenteranno
T. Sar - Ripristina Monica

18
Risposta molto bella. Grazie per aver confermato la mia opinione su Twitter come assolutamente inutile per tutto tranne che per suscitare entusiasmo.
Robert Harvey,

43

La mia domanda è: cosa significa che il passaggio ai microservizi crea un problema di runtime?

Cioè non è che cosa quei tweets hanno da dire! Non dicono nulla sul passaggio ai microservizi , né dicono nulla sulla creazione di problemi. Dicono solo qualcosa sui problemi di spostamento .

E mettono una limitazione contestuale alle loro affermazioni, vale a dire che la tua organizzazione è disfunzionale.

Quindi, ciò che sostanzialmente dice il primo tweet sono due cose:

  • "se la tua organizzazione non è in grado di progettare sistemi complessi ora senza microservizi, non sarà magicamente in grado di progettare sistemi complessi con microservizi" e
  • "i problemi causati da quella incapacità che ora si presentano durante la fase di compilazione, cioè durante lo sviluppo, verranno mostrati durante il runtime, cioè durante la produzione" (tecnicamente, potrebbero anche presentarsi durante i test, ma ricorda che la citazione si limita alle organizzazioni disfunzionali, che probabilmente hanno un regime di sperimentazione sub-standard)

Il secondo tweet afferma che il fatto che i problemi si manifestino solo nella produzione, cioè dove i clienti li vedono, è una caratteristica, non un bug, perché quando i clienti si lamentano, tende a essere ascoltato in luoghi diversi rispetto a quando si rompe una build, vale a dire in luoghi che sono in grado di fare qualcosa per la disfunzione organizzativa (es. gestione di alto livello). Poiché la disfunzione organizzativa di solito è un fallimento della gestione di alto livello, ciò significa che i clienti insoddisfatti riflettono male su coloro che sono alla fine responsabili di tale insoddisfazione, mentre la bassa qualità del codice causata da errori di gestione di livello superiore di solito si riflette solo sugli sviluppatori, che sono , tuttavia, non è in colpa e incapace di fare qualcosa al riguardo.

Quindi, il primo tweet afferma che i microservizi spostano i problemi causati da una cattiva gestione dal momento della compilazione, in cui solo gli sviluppatori li vedono, in fase di esecuzione, dove i clienti li vedono. Il secondo tweet dice che è una buona cosa, perché poi i problemi fanno male a coloro che ne sono responsabili.


6
@Michael Se non riesci a vedere in che modo influiscono sulla qualità del codice, forse considera quale impatto, se del caso, la gestione ha su qualsiasi parte della qualità dei prodotti creata dalla loro attività.
wl

30
@Michael: Alla fine, tutto è causato da una gestione di alto livello. La bassa qualità del codice è causata da scadenze impossibili? Chi fissa queste scadenze? Chi dice a coloro che fissano tali termini di fissare tali termini? La bassa qualità del codice è causata da sviluppatori incompetenti? Chi ha assunto quegli sviluppatori incompetenti? Chi ha assunto quelli che hanno assunto quegli sviluppatori incompetenti? È causato da strumenti inadeguati? Chi compra quegli strumenti? Chi approva il budget per acquistare quegli strumenti? È causato da una stupida architettura? Chi ha assunto l'architetto? Chi lo ha incaricato? Quei tweet erano specificamente nel contesto ...
Jörg W Mittag

13
... disfunzione organizzativa. Bene, far funzionare l'organizzazione è praticamente IL lavoro di gestione di livello superiore. Questo è ciò che la gestione è .
Jörg W Mittag,

4
Anche se probabilmente funzionerà a lungo termine, l'idea di risolvere i problemi della tua azienda facendoli influenzare i clienti non sembra giusta.
Stijn de Witt,

1
@ JörgWMittag Non credo sia ragionevole affermare che il cattivo codice scritto da cattivi sviluppatori sia colpa delle persone che hanno assunto quei cattivi sviluppatori e non degli stessi cattivi sviluppatori. Potrebbe essere in definitiva la responsabilità della gestione, ma è causata dagli sviluppatori.
Miles Rout

9

Crea un problema di runtime invece di un problema di compilazione .

Un'app monolitica è difficile e costosa da compilare. Ma una volta compilato puoi essere ragionevolmente sicuro che non esistono incompatibilità estremamente stupide tra i componenti, perché il sistema di tipi può catturarli. Lo stesso errore in un sistema di microservivi potrebbe non apparire fino a quando due componenti specifici non interagiranno effettivamente in un modo specifico.


9
Questo sembra presumere che le applicazioni "monolitiche" siano sempre tipizzate staticamente. Che dire delle lingue tipizzate dinamicamente? E le interfacce di servizio tipizzate staticamente?
JacquesB,

1
@JacquesB OTOH, riesco a pensare a zero lingue compilate esattamente in modo dinamico.
user253751

2
@JacquesB JavaScript e Python non sono compilati. A meno che non si contino le strutture di interprete interne come target di compilazione, nel qual caso viene compilata ogni lingua .
user253751

3
@immibis: ogni singola implementazione ECMAScript attualmente esistente ha almeno un compilatore. V8, ad esempio, ha due compilatori e esattamente zero interpreti, non interpreta mai , si compila sempre in codice binario nativo della macchina. SpiderMonkey ha quattro compilatori, credo, e un interprete, ma quell'interprete non interpreta ECMAScript. SpiderMonkey non interpreta mai ECMAScript, lo compila sempre prima in bytecode SpiderMonkey, che può quindi compilare ulteriormente in codice binario nativo della macchina. Tutte le implementazioni Python, Ruby e PHP attualmente esistenti dispongono di compilatori.
Jörg W Mittag

12
@LieRyan Sei seriamente confuso se pensi che l'inferenza di tipo sia la stessa di quella digitata dinamicamente e / o che Haskell sia tipizzata dinamicamente.
Derek Elkins,

2

Sia nei sistemi monolitici che nei microservizi è necessario definire le interfacce tra i sottosistemi. Le interfacce dovrebbero essere ben progettate, ben documentate e il più stabili possibile. Questo è lo stesso di OOP.

Se la tua organizzazione non è in grado di farlo, anche i microservizi non risolveranno il problema. Nei microservizi hai interfacce Web pubbliche. Quindi devi anche spendere più sforzi nella progettazione dell'interfaccia.

Se l'interfaccia non è progettata correttamente, otterrai due tipi di problemi di runtime:

  1. Se l'interfaccia non viene utilizzata correttamente, verrà visualizzato un errore in fase di esecuzione, non in fase di compilazione.
  2. La chiamata a un'interfaccia Web è piuttosto lenta, quindi è possibile ottenere problemi di prestazioni.

Penso che produrre problemi di runtime non sia il modo giusto di comunicare i problemi organizzativi a coloro che sono responsabili.

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.