Microservizi: le dimensioni contano, anche se hai Kubernetes

19 settembre a Mosca si è svolto il primo meetup tematico HUG (Highload++ User Group), dedicato ai microservizi. Durante l'incontro, è stata presentata la relazione "Gestione dei microservizi: le dimensioni contano, anche se hai Kubernetes", in cui abbiamo condiviso l'ampia esperienza della società "Flant" nella gestione di progetti con architettura a microservizi. Sarà particolarmente utile a tutti gli sviluppatori che stanno considerando di adottare questo approccio nel loro progetto attuale o futuro.

Microservizi: le dimensioni contano, anche se hai Kubernetes

Presentiamo il video della presentazione (50 minuti, molto più informativo di un articolo), insieme a un riassunto principale del contenuto in forma testuale.

NB: Il video e la presentazione sono disponibili anche alla fine di questa pubblicazione.

Introduzione

Di solito, una buona storia ha un'introduzione, una trama principale e una conclusione. Questa relazione è più simile a un'introduzione, peraltro tragica. È anche importante notare che offre una visione sui microservizi dal punto di vista sfruttamento.

Inizio con questo grafico, il cui autore (nel 2015) è diventata parte di Martin Fowler:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Mostra come, nel caso di un'applicazione monolitica, raggiunta una certa dimensione, la produttività inizia a diminuire. I microservizi si differenziano perché la produttività iniziale con essi è inferiore, ma man mano che aumenta la complessità, la degradazione dell'efficienza non è così evidente.

Aggiungo questo grafico per il caso di utilizzo di Kubernetes:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Perché un'applicazione a microservizi funziona meglio? Perché tale architettura pone serie esigenze all'architettura stessa, che sono eccellentemente soddisfatte dalle capacità di Kubernetes. D'altra parte, parte di questa funzionalità sarà utile anche per il monolite, soprattutto per il motivo che un tipico monolite al giorno d'oggi non è del tutto monolitico (i dettagli verranno presentati nella relazione).

Come si può notare, il grafico finale (una volta che sia le applicazioni monolitiche che quelle a microservizi operano su un'infrastruttura con Kubernetes) non differisce molto dall'originale. Discuteremo in seguito delle applicazioni gestite con Kubernetes.

Microservizi utili e dannosi

E qui la questione principale:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Cos'è un'architettura a microservizi normale? Deve portarti un reale vantaggio, aumentando l'efficienza del lavoro. Se torniamo al grafico, ecco cosa significa:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Se la chiamiamo utile, quindi dall'altra parte del grafico ci sarà microservizi dannosi (intralcia il lavoro): microservizi (creano problemi):

Microservizi: le dimensioni contano, anche se hai Kubernetes

Tornando al "pensiero centrale": vale la pena fidarsi della mia esperienza? Dall'inizio di quest'anno ho guardato 85 progetti. Non tutti erano microservizi (questa architettura era presente in circa un terzo a metà di essi), ma è comunque un numero considerevole. A noi (l'azienda "Flant") come fornitori di servizi riesce di vedere una grande varietà di applicazioni, sviluppate sia in piccole aziende (con 5 sviluppatori) che in grandi (~500 sviluppatori). Un ulteriore vantaggio è che vediamo come queste applicazioni vivono e si sviluppano nel corso degli anni.

Perché i microservizi?

Alla domanda sull'utilità dei microservizi c'è una risposta piuttosto concreta

  1. da parte del già citato Martin Fowler:
  2. confini chiari di modularità;
  3. deploy indipendente;

libertà di scelta delle tecnologie.

Microservizi: le dimensioni contano, anche se hai Kubernetes

Ho parlato molto con architetti e sviluppatori di software, chiedendo loro perché hanno bisogno di microservizi. E ho stilato la mia lista delle loro aspettative. Ecco cosa è emerso:

  • Se descrivessi "a sensazione" alcuni dei punti, direi che:
  • confini chiari dei moduli: ecco, abbiamo un terribile monolite, e ora tutto sarà ordinatamente suddiviso in repository Git, in cui tutto è "in ordine", senza mescolare il caldo con il morbido;
  • indipendenza nel deploy: potremo rilasciare i servizi in modo indipendente, affinché lo sviluppo proceda più rapidamente (pubblicare nuove funzionalità in parallelo);
  • bunindipendenza nello sviluppo: possiamo affidare questo microservizio a quel team/sviluppatore, e quello a un altro, il che ci consentirà di sviluppare più velocemente;

maggiore affidabilità: se si verifica una degradazione parziale (crolla un microservizio su 20), smetterà di funzionare solo un pulsante, mentre il sistema nel suo complesso continuerà a funzionare.

Architettura di microservizi tipica (dannosa) Per spiegare perché nella realtà le cose non sono così come ci aspettiamo, presenterò un'immagine

collettiva dell'architettura dei microservizi, basata sull'esperienza di molti progetti diversi.

Microservizi: le dimensioni contano, anche se hai Kubernetes

Un esempio sarà un negozio online astratto, che intende competere con Amazon o almeno con OZON. La sua architettura di microservizi appare così:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Per una serie di motivi, questi microservizi sono scritti su piattaforme diverse:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Quali sono le sue conseguenze?

Fowler ha anche un articolo su questo che parla della "retribuzione" per l'uso dei microservizi: Vediamo se le nostre aspettative sono state giustificate.

Microservizi: le dimensioni contano, anche se hai Kubernetes

Confini chiari dei moduli…

quanti microservizi dobbiamo realmente sistemare

Ma , per implementare una modifica? Possiamo davvero capire come funziona tutto senza un tracer distribuito (dato che ogni richiesta è gestita dalla metà dei microservizi)?Esiste un pattern "

grande palla di fango", e qui si è creata addirittura una palla di fango distribuita. A conferma di ciò, ecco un'illustrazione approssimativa di come circolano le richieste:Indipendenza nel deployment…

Microservizi: le dimensioni contano, anche se hai Kubernetes

Tecnicamente è stata raggiunta: possiamo aggiornare ogni microservizio separatamente. Ma nella pratica, dobbiamo tenere presente che di solito viene aggiornato

un numero elevato di microservizi , e dobbiamo considerarel'ordine del loro rollout . Idealmente dovremmo testare in un contesto separato se stiamo rilasciando la versione nell'ordine corretto.Libertà di scelta della tecnologia…

C'è. Solo che bisogna ricordare che spesso la libertà confina con l'anarchia. È molto importante non scegliere tecnologie solo per "giocare" con esse.

Indipendenza nello sviluppo…

Come creare un ambiente di test per l'intera applicazione (da un così gran numero di componenti)? E bisogna anche mantenerlo aggiornato. Tutto ciò porta al fatto che

il numero reale di ambienti di test , che possiamo effettivamente mantenere,risulta essere minimo. E implementare tutto questo localmente?.. Risulta che spesso lo sviluppatore svolge il proprio lavoro in modo indipendente, ma "alla cieca", perché costretto ad aspettare che si liberi un ambiente per il test..

Scalabilità separata…

Sì, ma è limitata nell'ambito dei DBMS utilizzati. Nell'esempio presentato, non ci saranno problemi con Cassandra, ma ci saranno con MySQL e PostgreSQL.

M

aggiore affidabilità…unNon solo il guasto di un microservizio danneggia spesso il corretto funzionamento dell'intero sistema, ma c'è anche un nuovo problema:

rendere ogni microservizio tollerante ai guasti è molto complesso . Perché nei microservizi vengono utilizzate tecnologie diverse (memcache, Redis, ecc.), e per ognuna bisogna pensare e implementare tutto, il che, ovviamente, è possibile, ma richiede enormi risorse.. Perché nei microservizi vengono utilizzate diverse tecnologie (memcache, Redis, ecc.), per ciascuna è necessario pianificare e implementare tutto, il che, ovviamente, è possibile, ma richiede enormi risorse.

Misurabilità del carico…

Con questo davvero tutto bene.

La "leggerezza" dei microservizi…

Non solo abbiamo avuto enormi oneri di rete (aumentano le richieste DNS, ecc.), ma a causa di un gran numero di sottoquery abbiamo cominciato a replicare i dati (memorizzare le cache), il che ha portato a un volume significativo di archiviazione.

Ecco come corrisponde alle nostre aspettative:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Ma non è tutto!

Perché:

  • Probabilmente avremo bisogno di un bus di messaggi.
  • Come fare un backup consistente al momento giusto? L'unica soluzione reale è interrompere il traffico per questo. Ma come farlo in produzione?
  • Se si tratta di supportare più regioni, organizzare la resilienza in ognuna di esse è un compito molto impegnativo.
  • Si presenta il problema di apportare modifiche centralizzate. Ad esempio, se dobbiamo aggiornare la versione di PHP, sarà necessario fare un commit in ogni repository (e ce ne sono decine).
  • La crescita della complessità operativa risulta esponenziale.

Cosa fare con tutto ciò?

Iniziate con un'applicazione monolitica. L'esperienza di Fowler sottolinea indica che praticamente tutte le applicazioni microservizi di successo sono iniziate come monoliti che sono diventati troppo grandi, dopo di che sono stati suddivisi. Allo stesso tempo, praticamente tutti i sistemi costruiti come microservizi sin dall'inizio, prima o poi, hanno affrontato seri problemi.

Un'altra considerazione preziosa è che affinché un progetto con architettura microservizi abbia successo, è necessario conoscere molto bene sia l'area tematica che come costruire microservizi. E il modo migliore per conoscere l'area tematica è realizzare un monolite.

Ma cosa fare se ci troviamo già in questa situazione?

Il primo passo per risolvere qualsiasi problema è accettarlo e comprendere che è un problema, che non vogliamo più soffrire.

Se nel caso di un monolite ingrandito (quando abbiamo esaurito la possibilità di acquistare risorse per esso) lo tagliamo, in questo caso si presenta la storia opposta: quando un'eccessiva microservizi non aiuta più, ma ostacola — ritagliate l'eccesso e raggruppate!

Ad esempio, per l'immagine collettiva sopra...

Liberatevi dei microservizi più discutibili:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Unite tutti i microservizi responsabili per la generazione del frontend:

Microservizi: le dimensioni contano, anche se hai Kubernetes

… in un microservizio, scritto in uno (moderno e adeguato, come ritenete voi) linguaggio/framework:

Microservizi: le dimensioni contano, anche se hai Kubernetes

Avrà un solo ORM (un solo DBMS) e inizialmente un paio di applicazioni:

Microservizi: le dimensioni contano, anche se hai Kubernetes

… in realtà si può trasferire molto di più, ottenendo un risultato del genere:

Microservizi: le dimensioni contano, anche se hai Kubernetes

In Kubernetes avviamo tutto questo come istanze separate, e questo significa che possiamo ancora misurare il carico e scalarle singolarmente.

In sintesi

Guarda il quadro in modo più ampio. Molto spesso, tutti questi problemi con i microservizi sorgono perché qualcuno ha preso il proprio compito, ma voleva "giocare ai microservizi".

Nella parola "microservizi" la parte "micro" è superflua. Sono "micro" solo perché più piccoli di un grande monolito. Ma non bisogna pensarli come a qualcosa di piccolo.

E per la riflessione finale, torniamo alla grafica iniziale:

Microservizi: le dimensioni contano, anche se hai Kubernetes

La nota scritta a it (in alto a destra) sintetizza il fatto che le competenze del team che realizza il vostro progetto sono sempre primarie — saranno proprio loro a giocare un ruolo chiave nella vostra scelta tra microservizi e monoliti. Se il team non ha le abilità necessarie, ma inizia a fare microservizi, la storia sarà sicuramente fatale.

Video e slide

Video della presentazione (~50 minuti; sfortunatamente, non cattura le numerose emozioni dei partecipanti, che hanno in gran parte definito l'umore del discorso, ma così è):

Guarda il video

Presentazione della relazione:

P.S.

Altre presentazioni nel nostro blog:

Probabilmente vi interesseranno anche le seguenti pubblicazioni:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster