Orchestrazione di microservizi


200

Qual è il modello standard di orchestrazione dei microservizi?

Se un microservizio conosce solo il proprio dominio, ma esiste un flusso di dati che richiede che più servizi interagiscano in qualche modo, qual è la strada da percorrere?

Diciamo che abbiamo qualcosa del genere:

  • fatturazione
  • Spedizione

E per il bene dell'argomento, diciamo che una volta che un ordine è stato spedito, la fattura dovrebbe essere creata.

Da qualche parte, qualcuno preme un pulsante in un GUI"Ho finito, facciamolo!" In una classica architettura di servizio monolite, direi che esiste una ESBgestione di questo, oppure che il servizio di spedizione è a conoscenza del servizio di fatturazione e lo chiama.

Ma qual è il modo in cui le persone affrontano questo problema in questo nuovo coraggioso mondo di microservizi?

Capisco che questo potrebbe essere considerato altamente basato sull'opinione pubblica. ma c'è un lato concreto, poiché i microservizi non dovrebbero fare quanto sopra. Quindi ci deve essere un "cosa dovrebbe invece fare per definizione", che non è basato sull'opinione.

Sparare.

Risposte:


316

Il Book Building Microservices descrive in dettaglio gli stili citati da @RogerAlsing nella sua risposta.

A pagina 43 sotto Orchestrazione vs Coreografia il libro dice:

Quando iniziamo a modellare una logica sempre più complessa, dobbiamo affrontare il problema della gestione dei processi aziendali che si estendono oltre i confini dei singoli servizi. E con i microservizi, raggiungeremo questo limite prima del solito. [...] Quando si tratta di implementare effettivamente questo flusso, ci sono due stili di architettura che potremmo seguire. Con l'orchestrazione, ci affidiamo a un cervello centrale per guidare e guidare il processo, proprio come il direttore d'orchestra. Con la coreografia, informiamo ogni parte del sistema del suo lavoro e lasciamo che elabori i dettagli, come tutti i ballerini che trovano la loro strada e reagiscono agli altri intorno a loro in un balletto.

Il libro procede quindi a spiegare i due stili. Lo stile dell'orchestrazione corrisponde più all'idea SOA dei servizi di orchestrazione / attività , mentre lo stile coreografico corrisponde alle stupide pipe e agli endpoint intelligenti menzionati nell'articolo di Martin Fowler.

Stile orchestrazione

Sotto questo stile, il libro sopra menziona:

Pensiamo a come sarebbe una soluzione di orchestrazione per questo flusso. Qui, probabilmente la cosa più semplice da fare sarebbe fare in modo che il nostro servizio clienti funga da cervello centrale. Al momento della creazione, parla con la banca punti fedeltà, il servizio e-mail e il servizio postale [...], attraverso una serie di chiamate di richiesta / risposta. Il servizio clienti stesso può quindi tracciare dove si trova un cliente in questo processo. Può verificare se l'account del cliente è stato impostato, l'email inviata o la posta consegnata. Possiamo prendere il diagramma di flusso [...] e modellarlo direttamente in codice. Potremmo persino usare strumenti che lo implementano per noi, magari usando un motore di regole adeguato. A tale scopo esistono strumenti commerciali sotto forma di software di modellizzazione dei processi aziendali. Supponendo che utilizziamo la richiesta / risposta sincrona, potremmo persino sapere se ogni fase ha funzionato [...] L'aspetto negativo di questo approccio di orchestrazione è che il servizio clienti può diventare troppo un'autorità governativa centrale. Può diventare l'hub nel mezzo di una rete e un punto centrale in cui la logica inizia a vivere. Ho visto questo approccio sfociare in un piccolo numero di servizi intelligenti "divini" che dicono ai servizi anemici basati su CRUD cosa fare.

Nota: suppongo che quando l'autore menziona gli strumenti si riferisca a qualcosa come BPM (ad es. Activity , Apache ODE , Camunda ). È un dato di fatto, il sito Web dei modelli di flusso di lavoro ha un fantastico set di modelli per eseguire questo tipo di orchestrazione e offre anche dettagli di valutazione di diversi strumenti del fornitore che aiutano a implementarlo in questo modo. Non penso che l'autore implichi che è necessario utilizzare uno di questi strumenti per implementare questo stile di integrazione, tuttavia è possibile utilizzare altri framework di orchestrazione leggeri, ad esempio Spring Integration , Apache Camel o Mule ESB

Tuttavia, altri libri che ho letto sull'argomento dei microservizi e in generale la maggior parte degli articoli che ho trovato sul web sembrano sfavorire questo approccio di orchestrazione e suggeriscono invece di usare quello successivo.

Stile coreografico

Sotto lo stile delle coreografie l'autore dice:

Con un approccio coreografico, potremmo invece far sì che il servizio clienti emetta un evento in modo asincrono, affermando che il cliente è stato creato. Il servizio di posta elettronica, il servizio postale e la banca di punti fedeltà si iscrivono quindi solo a questi eventi e reagiscono di conseguenza [...] Questo approccio è significativamente più disaccoppiato. Se è necessario un altro servizio per raggiungere la creazione di un cliente, deve solo iscriversi agli eventi e svolgere il proprio lavoro quando necessario. Il rovescio della medaglia è che la visione esplicita del processo aziendale che vediamo nel [flusso di lavoro] ora si riflette solo implicitamente nel nostro sistema [...] Ciò significa che è necessario un lavoro aggiuntivo per garantire che sia possibile monitorare e tenere traccia delle cose giuste è accaduto. Per esempio, sapresti se la banca dei punti fedeltà ha avuto un bug e per qualche motivo non ha creato l'account corretto? Un approccio che mi piace affrontare con questo è quello di costruire un sistema di monitoraggio che corrisponda esplicitamente alla visione del processo aziendale in [il flusso di lavoro], ma che quindi segua ciò che ciascuno dei servizi fa come entità indipendenti, permettendoti di vedere strane eccezioni mappate sul flusso di processo più esplicito. Il [diagramma di flusso] [...] non è la forza trainante, ma solo un obiettivo attraverso il quale possiamo vedere come si comporta il sistema. In generale, ho scoperto che i sistemi che tendono maggiormente all'approccio coreografico sono accoppiati più liberamente, e sono più flessibili e suscettibili di cambiamento. Tuttavia, è necessario svolgere un lavoro extra per monitorare e tracciare i processi oltre i confini del sistema. Ho trovato le implementazioni maggiormente orchestrate estremamente fragili, con un costo di cambiamento più elevato. Con questo in mente, preferisco fortemente puntare su un sistema coreografato, in cui ogni servizio è abbastanza intelligente da capire il suo ruolo nell'intera danza.

Nota: fino ad oggi non sono ancora sicuro che la coreografia sia solo un altro nome per l' architettura guidata dagli eventi (EDA), ma se l'EDA è solo un modo per farlo, quali sono gli altri modi? (Vedi anche Cosa intendi con "Event-Driven"? E The Meanings of Event-Driven Architecture ). Inoltre, sembra che cose come CQRS ed EventSourcing risuonino molto con questo stile architettonico, giusto?

Ora, dopo questo arriva il divertimento. Il libro sui microservizi non presuppone che i microservizi saranno implementati con REST. È un dato di fatto nella prossima sezione del libro, continuano a considerare le soluzioni basate su RPC e SOA e infine il REST. Un punto importante qui è che i microservizi non implicano il REST.

Quindi, che dire di HATEOAS? (Hypermedia come motore dello stato dell'applicazione)

Ora, se vogliamo seguire l'approccio RESTful, non possiamo ignorare HATEOAS o Roy Fielding sarà molto contento di dire nel suo blog che la nostra soluzione non è veramente REST. Vedi il suo post sul blog sull'API REST Deve essere Hypertext Driven :

Mi sento frustrato dal numero di persone che chiamano qualsiasi interfaccia basata su HTTP un'API REST. Cosa bisogna fare per rendere chiaro lo stile architettonico REST sull'idea che l'ipertesto sia un vincolo? In altre parole, se il motore dello stato dell'applicazione (e quindi l'API) non è guidato dall'ipertesto, non può essere RESTful e non può essere un'API REST. Periodo. C'è qualche manuale rotto da qualche parte che deve essere riparato?

Quindi, come puoi vedere, Fielding pensa che senza HATEOAS non stai veramente costruendo applicazioni RESTful. Per Fielding, HATEOAS è la strada da percorrere quando si tratta di servizi di orchestrazione. Sto solo imparando tutto questo, ma per me, HATEOAS non definisce chiaramente chi o quale sia la forza trainante dietro effettivamente seguire i collegamenti. In un'interfaccia utente che potrebbe essere l'utente, ma nelle interazioni computer-computer, suppongo che debba essere fatto da un servizio di livello superiore.

Secondo HATEOAS, l'unico collegamento che il consumatore dell'API deve veramente conoscere è quello che avvia la comunicazione con il server (ad es. POST / ordine). Da questo punto in poi, REST eseguirà il flusso, poiché, nella risposta di questo endpoint, la risorsa restituita conterrà i collegamenti ai successivi stati possibili. Il consumatore dell'API decide quindi quale collegamento seguire e sposta l'applicazione allo stato successivo.

Nonostante quanto sia bello, il client deve ancora sapere se il link deve essere POSTATO, MESSO, OTTENUTO, PATCH, ecc. E il cliente deve ancora decidere quale payload deve passare. Il cliente deve ancora essere consapevole di cosa fare se fallisce (riprovare, compensare, annullare, ecc.).

Sono abbastanza nuovo in tutto questo, ma per me, dal punto di vista di HATEOA, questo cliente o consumatore API è un servizio di alto livello. Se lo pensiamo dal punto di vista di un essere umano, puoi immaginare un utente finale su una pagina web, decidere quali link seguire, ma il programmatore della pagina web deve decidere quale metodo utilizzare per invocare i link, e quale payload passare. Quindi, a mio avviso, in un'interazione computer-computer, il computer assume il ruolo di utente finale. Ancora una volta questo è ciò che chiamiamo un servizio di orchestrazioni.

Suppongo che possiamo usare HATEOAS con l'orchestrazione o la coreografia.

Il modello gateway API

Un altro modello interessante è suggerito da Chris Richardson che ha anche proposto quello che ha chiamato un modello gateway API .

In un'architettura monolitica, i client dell'applicazione, come i browser Web e le applicazioni native, inviano richieste HTTP tramite un bilanciamento del carico a una delle N istanze identiche dell'applicazione. Ma in un'architettura a microservizi, il monolito è stato sostituito da una raccolta di servizi. Di conseguenza, una domanda chiave a cui dobbiamo rispondere è con cosa interagiscono i clienti?

Un client applicativo, come un'applicazione mobile nativa, potrebbe fare richieste HTTP RESTful ai singoli servizi [...] In superficie questo potrebbe sembrare attraente. Tuttavia, è probabile che vi sia una significativa discrepanza nella granularità tra le API dei singoli servizi e i dati richiesti dai clienti. Ad esempio, la visualizzazione di una pagina Web potrebbe potenzialmente richiedere chiamate a un gran numero di servizi. Amazon.com, ad esempio, descrive come alcune pagine richiedono chiamate a oltre 100 servizi. Fare molte richieste, anche attraverso una connessione Internet ad alta velocità, per non parlare di una rete mobile a larghezza di banda inferiore e latenza più elevata, sarebbe molto inefficiente e si tradurrebbe in un'esperienza utente scadente.

Un approccio molto migliore è che i client facciano un piccolo numero di richieste per pagina, forse solo una, su Internet a un server front-end noto come gateway API.

Il gateway API si trova tra i client dell'applicazione e i microservizi. Fornisce API su misura per il client. Il gateway API fornisce un'API a grana grossa ai client mobili e un'API a grana più fine ai client desktop che utilizzano una rete ad alte prestazioni. In questo esempio, i client desktop effettuano più richieste per recuperare informazioni su un prodotto, mentre un client mobile effettua una singola richiesta.

Il gateway API gestisce le richieste in arrivo inviando richieste a un numero di microservizi sulla LAN ad alte prestazioni. Netflix, ad esempio, descrive in che modo ogni richiesta viene inviata in media a sei servizi back-end. In questo esempio, le richieste a grana fine da un client desktop vengono semplicemente inoltrate al servizio corrispondente, mentre ogni richiesta a grana grossa da un client mobile viene gestita aggregando i risultati della chiamata a più servizi.

Il gateway API non solo ottimizza la comunicazione tra i client e l'applicazione, ma incapsula anche i dettagli dei microservizi. Ciò consente ai microservizi di evolversi senza influire sui client. Ad esempio, due microservizi potrebbero essere uniti. Un altro microservizio potrebbe essere suddiviso in due o più servizi. Solo il gateway API deve essere aggiornato per riflettere queste modifiche. I clienti non sono interessati.

Ora che abbiamo esaminato il modo in cui il gateway API media tra l'applicazione e i suoi client, vediamo ora come implementare la comunicazione tra microservizi.

Sembra abbastanza simile allo stile di orchestrazione di cui sopra, solo con un intento leggermente diverso, in questo caso, sembra essere tutto incentrato sulle prestazioni e sulla semplificazione delle interazioni.


15
Buona risposta! Una domanda: se combinassi i microservizi in stile coreografico con un gateway API, il gateway API non si trasformerebbe nell'autorità governativa centrale che descrivi come il lato negativo dei microservizi in stile orchestrazione? O, in altre parole, dov'è esattamente la differenza tra "Stile orchestrazione" e Pattern gateway API?
Fritz Duchardt,

4
@FritzDuchardt non esattamente. Mentre api-gateway diventa un singolo punto di errore, non è necessariamente un'autorità governativa di alcun tipo. Un api-gateway molto semplice potrebbe semplicemente autenticare le richieste e inviarle al loro servizio di destinazione. Il modello api-gateway è principalmente per semplificare le interazioni client-backend attraverso un singolo servizio, non risolve direttamente il problema di orchestrare o coreografare i servizi a cui il proxy API gateway procede (che di per sé è un servizio).
Porlune,

Bella risposta! Solo una domanda relativa ai gateway API: GraphQL è il gateway API di prossima generazione e potrebbe benissimo sostituire i gateway API?
Kenneho,

Sto cercando di capirlo da un punto di vista pratico. La coreografia è accoppiata più liberamente -> in tal caso un EventListener dovrebbe essere aggiunto dinamicamente al metodo api? Altrimenti se non ogni metodo api reagirà sempre a un evento ricevuto (-> e quindi non è accoppiato liberamente)
Vincent

Non sono d'accordo sul fatto che la coreografia sia accoppiata più liberamente e quindi l'orchestrazione debba essere evitata con i microservizi. Ne ho parlato per esempio in berndruecker.io/complex-event-flows-in-distributed-systems . Hai bisogno di un approccio più equilibrato nella tua architettura.
Bernd Ruecker,

35

Cercando di aggregare i diversi approcci qui.

Eventi di dominio

L'approccio dominante per questo sembra essere l'utilizzo di eventi di dominio, in cui ciascun servizio pubblica eventi relativi a ciò che è accaduto e altri servizi possono iscriversi a tali eventi. Questo sembra andare di pari passo con il concetto di endpoint intelligenti, pipe stupide che è descritto da Martin Fowler qui: http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes

Eventi di dominio

delega

Un altro approccio che sembra comune è quello di avvolgere il flusso aziendale nel proprio servizio. Dove il proxy orchestra l'interazione tra i microservizi come mostrato nell'immagine seguente:

Proxy.

Altri motivi della composizione

Questa pagina contiene vari schemi di composizione.


Ecco un bel video quali sono gli altri schemi e come puoi combinarli youtu.be/tSN1gOVQfPs?t=35m35s Suggerisci di aggiungerli alla tua risposta
Grygoriy Gonchar

Nic images @Roger, quale strumento stavi usando?
Selvakumar Esra,

1
@SelvakumarEsra draw.io
Roger Johansson,

7

Quindi, in che modo l'orchestrazione di microservizi è diversa dall'orchestrazione di vecchi servizi SOA che non sono “micro”? Non molto.

I microservizi di solito comunicano tramite http (REST) ​​o messaggi / eventi. L'orchestrazione è spesso associata a piattaforme di orchestrazione che consentono di creare un'interazione con script tra servizi per automatizzare i flussi di lavoro. Ai vecchi tempi della SOA, queste piattaforme utilizzavano WS-BPEL. Gli strumenti di oggi non usano BPEL. Esempi di moderni prodotti di orchestrazione: Netflix Conductor, Camunda, Zeebe, Azure Logic Apps, Baker.

Tieni presente che l'orchestrazione è un modello composto che offre diverse funzionalità per creare composizioni complesse di servizi. I microservizi sono più spesso visti come servizi che non dovrebbero partecipare a composizioni complesse e piuttosto essere più autonomi.

Vedo un microservizio essere invocato in un flusso di lavoro orchestrato per eseguire alcune semplici elaborazioni, ma non vedo un microservizio come servizio dell'orchestratore, che spesso utilizza meccanismi come le transazioni di compensazione e il deposito di stato (disidratazione).


va notato che "gli strumenti di oggi" nel tuo post, fanno ancora uso di eventi, dati e attività in qualche modo, per "modellare" un flusso - camunda usa BPMN, che è vicino a BPEL, e gli altri hanno semplicemente definito il proprio DSL per rappresentare un concetto simile.
Hightower,

5

Quindi hai due servizi:

  1. Micro servizio di fatturazione
  2. Micro servizio di spedizione

Nella vita reale, avresti qualcosa in cui mantieni lo stato dell'ordine. Chiamiamolo servizio di ordinazione. Successivamente hai i casi d'uso di elaborazione degli ordini, che sanno cosa fare quando l'ordine passa da uno stato a un altro. Tutti questi servizi contengono un determinato insieme di dati e ora hai bisogno di qualcos'altro che faccia tutto il coordinamento. Questo potrebbe essere:

  • Una semplice GUI che conosce tutti i tuoi servizi e implementa i casi d'uso ("I done" chiama il servizio di spedizione)
  • Un motore di processo aziendale, in attesa di un evento "Ho finito". Questo motore implementa i casi d'uso e il flusso.
  • Un micro servizio di orchestrazione, diciamo lo stesso servizio di elaborazione degli ordini che conosce i casi di flusso / utilizzo del tuo dominio
  • Qualcos'altro a cui non avevo ancora pensato

Il punto principale con questo è che il controllo è esterno. Questo perché tutti i componenti dell'applicazione sono elementi costitutivi individuali, liberamente accoppiati. Se i casi d'uso cambiano, è necessario modificare un componente in un unico punto, che è il componente orchestrazione. Se si aggiunge un flusso di ordini diverso, è possibile aggiungere facilmente un altro orchestrator che non interferisce con il primo. Il pensiero del micro-servizio non riguarda solo la scalabilità e l'esecuzione di fantasiose API REST, ma anche una struttura chiara, ridotte dipendenze tra i componenti e il riutilizzo di dati e funzionalità comuni condivisi in tutta l'azienda.

HTH, Mark


1

Se lo Stato deve essere gestito, l'Evento di sourcing con CQRS è il modo ideale di comunicazione. Altrimenti, un sistema di messaggistica asincrona (AMQP) può essere utilizzato per la comunicazione tra microservizi.

Dalla tua domanda, è chiaro che l'ES con CQRS dovrebbe essere il giusto mix. Se usi java, dai un'occhiata al framework Axon. O crea una soluzione personalizzata usando Kafka o RabbitMQ.


-2

ho scritto alcuni post su questo argomento:

Forse questi post possono anche aiutare:

Schema gateway API: API granulose rispetto alle API a grana fine

https://www.linkedin.com/pulse/api-gateway-pattern-ronen-hamias/ https://www.linkedin.com/pulse/successfulapi-ronen-hamias/

API di servizio a grana grossa vs a grana fine

Per definizione un'operazione di servizio a grana grossa ha una portata più ampia di un servizio a grana fine, sebbene i termini siano relativi. maggiore complessità di progettazione a grana grossa ma può ridurre il numero di chiamate necessarie per completare un'attività. nell'architettura di micro-servizi, la grana grossa può risiedere a livello del gateway API e orchestrare numerosi micro-servizi per completare operazioni aziendali specifiche. Le API a grana grossa devono essere attentamente progettate in modo da coinvolgere diversi micro-servizi che la gestione di diversi domini di competenza ha il rischio di mescolare preoccupazioni in un'unica API e infrangere le regole sopra descritte. Le API a grana grossa possono suggerire un nuovo livello di granularità per funzioni aziendali che altrimenti non esisterebbero. ad esempio, assumere un dipendente può comportare due chiamate di microservizi al sistema HR per creare un ID dipendente e un'altra chiamata al sistema LDAP per creare un account utente. in alternativa, il client potrebbe aver eseguito due chiamate API a grana fine per ottenere lo stesso compito. mentre a grana grossa rappresenta il caso d'uso aziendale di creare un account utente, l'API a grana fine rappresenta le capacità coinvolte in tale compito. ulteriori API a grana più fine possono coinvolgere diverse tecnologie e protocolli di comunicazione mentre a grana grossa li astraggono in flusso unificato. quando si progetta un sistema considerare entrambi come di nuovo non esiste un approccio aureo che risolva tutto e c'è un compromesso per ciascuno. A grana grossa sono particolarmente adatti come servizi da consumarsi in altri contesti aziendali, come altre applicazioni,


-2

la risposta alla domanda originale è il modello SAGA.


4
Vuoi espandere la tua risposta?
Patrick Mevzek,

Saga cerca di imitare le transazioni, per ogni operazione che fornisci un'operazione di annullamento. Se una catena di operazioni fallisce, le operazioni di annullamento vengono invocate fino all'origine.
sschrass

Sembra una risposta casuale. L'elaborazione necessaria.
Bharatesh,
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.