Condividi tramite


Modello coreografico

Il modello Coreografa decentralizza la logica del flusso di lavoro e distribuisce le responsabilità ad altri componenti all'interno di un sistema. Invece di dipendere da un agente di orchestrazione centrale, i servizi decidono quando e come elaborare un'operazione aziendale.

Contesto e problema

In genere si divide un'applicazione basata sul cloud in diversi servizi di piccole dimensioni che interagiscono per elaborare una transazione aziendale end-to-end. Una singola operazione all'interno di una transazione può comportare più chiamate da punto a punto tra tutti i servizi. Idealmente, questi servizi sono ad accoppiamento libero. È difficile progettare un flusso di lavoro distribuito, efficiente e scalabile perché comporta una comunicazione interservizi complessa.

Un modello comune per la comunicazione consiste nell'usare un servizio centralizzato o un agente di orchestrazione. Le richieste in ingresso fluiscono attraverso l'orchestratore che delega le operazioni ai rispettivi servizi. Ogni servizio completa la propria responsabilità e non è a conoscenza del flusso di lavoro complessivo.

Diagramma di un flusso di lavoro che usa un agente di orchestrazione centrale per elaborare le richieste.

In genere si implementa lo schema dell'agente di orchestrazione come software personalizzato con conoscenze di dominio sulle responsabilità dei servizi all'interno del sistema. Un vantaggio di questo approccio è che l'agente di orchestrazione può consolidare lo stato di una transazione in base ai risultati delle singole operazioni eseguite dai servizi downstream.

Questo approccio crea anche alcuni ostacoli. L'aggiunta o la rimozione di servizi potrebbe interrompere la logica esistente perché è necessario collegare parti del percorso di comunicazione. Questa dipendenza rende l'implementazione dell'agente di orchestrazione complessa e difficile da gestire. L'orchestratore potrebbe influire negativamente sulla stabilità del carico di lavoro. In fase di caricamento, può introdurre colli di bottiglia delle prestazioni e essere il singolo punto di errore (SPoF). Può anche causare errori a catena nei servizi downstream.

Soluzione

Delegare la logica di gestione delle transazioni tra i servizi. Consentire a ogni servizio di partecipare al flusso di lavoro di comunicazione per un'operazione aziendale e decidere quando e come elaborarlo.

Il modello Coreografia riduce al minimo la dipendenza dal software personalizzato che centralizza il flusso di comunicazione. I componenti implementano la logica comune mentre coreografano il flusso di lavoro tra loro senza comunicare direttamente tra loro.

Un modo comune per implementare la coreografia consiste nell'usare un broker di messaggi che memorizza nel buffer le richieste fino a quando i componenti downstream non le richiedano e le elaborino. L'immagine seguente mostra la gestione delle richieste tramite un modello publisher-subscriber.

Diagramma che mostra come un broker di messaggi elabora una richiesta.

  1. Il client invia le richieste in coda come messaggi in un broker di messaggi.

  2. I servizi o il sottoscrittore esegue il polling del broker per determinare se è in grado di elaborare tale messaggio secondo la logica aziendale implementata. Il broker può anche eseguire il push dei messaggi ai sottoscrittori interessati a tale messaggio.

  3. Ogni servizio sottoscritto esegue l'operazione come indica il messaggio e risponde al broker con un messaggio di operazione riuscita o di errore.

  4. Se l'operazione ha esito positivo, il servizio può eseguire il push di un messaggio nella stessa coda o in una coda di messaggi diversa in modo che un altro servizio possa continuare il flusso di lavoro, se necessario. Se l'operazione non riesce, il broker di messaggi collabora con altri servizi per compensare tale operazione o l'intera transazione.

Problemi e considerazioni

Quando si decide come implementare questo modello, tenere presente quanto segue:

Quando usare questo modello

Usare questo modello quando:

  • I componenti downstream gestiscono le operazioni atomica in modo indipendente. Si pensi a questo modello come a un meccanismo 'fire and forget', in cui un componente esegue un'attività che non richiede una gestione attiva. Al termine dell'attività, il componente invia una notifica agli altri componenti.

  • Si prevede di aggiornare e sostituire frequentemente i componenti. Questo modello consente di modificare l'applicazione con un minor impegno e un'interruzione minima dei servizi esistenti.

  • Si usano architetture serverless per flussi di lavoro semplici. I componenti possono avere breve durata e essere basati su eventi. Quando si verifica un evento, il servizio crea componenti che eseguono un'attività e il servizio rimuove i componenti dopo il completamento dell'attività.

  • La comunicazione tra contesti delimitati richiede un accoppiamento libero tra i limiti del dominio. Per la comunicazione all'interno di un singolo contesto delimitato, applicare invece un pattern di orchestrazione.

  • L'orchestratore centrale introduce un collo di bottiglia delle prestazioni.

Questo modello potrebbe non essere adatto quando:

  • L'applicazione è complessa e richiede un componente centrale per gestire la logica condivisa per mantenere leggeri i componenti downstream.

  • La comunicazione da punto a punto tra i componenti è inevitabile.

  • È necessario usare la logica di business per consolidare tutte le operazioni gestite dai componenti downstream.

Progettazione del carico di lavoro

Valutare come usare il modello Coreografia nella progettazione di un carico di lavoro per affrontare gli obiettivi e i principi trattati nei pilastri di Azure Well-Architected Framework. La tabella seguente fornisce indicazioni su come questo modello supporta gli obiettivi di ogni pilastro.

Pilastro Come questo modello supporta gli obiettivi di pilastro
L'eccellenza operativa consente di offrire la qualità del carico di lavoro attraverso processi standardizzati e coesione del team. I componenti distribuiti in questo modello sono autonomi e progettati per essere sostituibili, in modo da poter modificare il carico di lavoro con modifiche meno complessive al sistema.

- Strumenti e processi di OE:04
l'efficienza delle prestazioni consente al carico di lavoro soddisfare in modo efficiente le richieste tramite ottimizzazioni di ridimensionamento, dati e codice. Questo modello offre un'alternativa quando si verificano colli di bottiglia delle prestazioni in una topologia di orchestrazione centralizzata.

- PE:02 Pianificazione della capacità
- PE:05 Ridimensionamento e partizionamento

Se questo modello introduce compromessi all'interno di un pilastro, considerarli contro gli obiettivi degli altri pilastri.

Esempio

Questo esempio illustra il modello Coreografa creando un carico di lavoro nativo del cloud basato su eventi che esegue funzioni insieme ai microservizi. Quando un client richiede di spedire un pacchetto, il carico di lavoro assegna un drone. Dopo che il pacchetto è pronto per il ritiro dal drone pianificato, viene avviato il processo di consegna. Mentre il pacchetto è in transito, il carico di lavoro gestisce il recapito fino a quando non riceve lo stato di spedizione.

Diagramma di un carico di lavoro di esempio nativo del cloud basato su eventi che implementa il modello Coreografia.

Il servizio di inserimento riceve le richieste client e le converte in messaggi che includono i dettagli del recapito. Le transazioni aziendali iniziano dopo l'utilizzo dei nuovi messaggi da parte dei servizi.

Una singola transazione aziendale client richiede tre operazioni aziendali distinte:

  • Creare o aggiornare un pacchetto.

  • Assegnare un drone per recapitare il pacchetto.

  • Gestire il recapito, incluso il controllo e l'invio di una notifica quando il pacchetto viene fornito.

I microservizi dei pacchetti, del gestore dei droni e del recapito eseguono l'elaborazione dei processi aziendali. I servizi usano la messaggistica anziché un agente di orchestrazione centrale per comunicare tra loro. Ogni servizio deve implementare un protocollo in anticipo che coordina il flusso di lavoro aziendale in modo decentralizzato.

Design

I servizi elaborano le transazioni aziendali in sequenza attraverso più passaggi. Ogni hop condivide un singolo bus di messaggi tra tutti i servizi aziendali.

Quando un client invia una richiesta di recapito tramite un endpoint HTTP, il servizio di inserimento lo riceve, lo converte in un messaggio e quindi pubblica il messaggio nel bus di messaggi condiviso. I servizi aziendali sottoscritti consumano i nuovi messaggi aggiunti al bus. Quando un servizio aziendale riceve il messaggio, completa correttamente l'operazione oppure la richiesta ha esito negativo o si verifica il timeout. Se la richiesta ha esito positivo, il servizio risponde al bus con il Ok codice di stato, genera un nuovo messaggio di operazione e lo invia al bus di messaggi. Se la richiesta ha esito negativo o si verifica il timeout, il servizio segnala l'errore inviando il codice motivo al bus di messaggi e quindi aggiunge il messaggio a una coda di messaggi non recapitabili (DLQ). Il servizio sposta anche i messaggi che non riesce a ricevere o elaborare entro un determinato periodo di tempo nella DLQ.

Questa progettazione usa più bus di messaggio per elaborare l'intera transazione aziendale. Il bus di servizio di Azure e Griglia di eventi di Azure forniscono la piattaforma del servizio di messaggistica per questa progettazione. Il carico di lavoro viene eseguito in Azure Container Apps, che ospita Azure Functions per l'inserimento. Container Apps gestisce l'elaborazione guidata dagli eventi che esegue la logica di business.

Questo design garantisce anche che la coreografia si verifichi in una sequenza. Un singolo spazio dei nomi del bus di servizio contiene un argomento con due sottoscrizioni e una coda compatibile con la sessione. Il servizio di inserimento pubblica messaggi nel topic. Il servizio di gestione dei pacchetti e il servizio di pianificazione dei droni si iscrivono al canale e pubblicano messaggi che notificano alla coda le richieste riuscite. Includere un identificatore di sessione comune che associa un GUID all'identificatore di recapito in modo che i servizi possano gestire sequenze non associate di messaggi correlati in ordine. Il servizio di recapito attende due messaggi correlati per ogni transazione. Il primo messaggio indica che il pacchetto è pronto per essere spedito e il secondo messaggio segnala che è pianificato un drone.

In questa progettazione, il bus di servizio gestisce messaggi di valore elevato che non devono essere persi o duplicati durante l'intero processo di recapito. Quando il pacchetto viene fornito, una modifica dello stato viene pubblicata in Griglia di eventi. Il mittente dell'evento non si aspetta come viene gestita la modifica dello stato. I servizi dell'organizzazione downstream che questa progettazione non include possono restare in ascolto di questo tipo di evento ed eseguire logica di business specifica, ad esempio l'invio di un messaggio di posta elettronica di stato dell'ordine all'utente.

Se distribuisci questo modello in un altro servizio di calcolo, ad esempio AKS, puoi implementare il boilerplate dell'applicazione del modello Publisher-Subscriber con due contenitori nello stesso pod. Un contenitore esegue l'ambassador che interagisce con il bus di messaggi scelto mentre l'altro contenitore esegue la logica di business. Questo approccio migliora le prestazioni e la scalabilità. L'ambasciatore e il servizio aziendale condividono la stessa rete, riducendo la latenza e aumentando la velocità effettiva.

Per evitare operazioni di ripetizione a catena che potrebbero causare più tentativi, i servizi aziendali devono contrassegnare immediatamente messaggi inaccettabili. Arricchite questi messaggi usando codici motivo comuni o un codice dell'applicazione definito affinché i servizi possano spostarli in una DLQ. Prendere in considerazione l'implementazione del modello Saga per gestire i problemi di coerenza dai servizi downstream. Ad esempio, un altro servizio gestisce i messaggi non recapitabili a scopo di correzione solo eseguendo una compensazione, un nuovo tentativo o una transazione pivot.

I servizi aziendali sono idempotenti per garantire che le operazioni di ripetizione dei tentativi non creino risorse duplicate. Ad esempio, il servizio pacchetti usa operazioni upsert per aggiungere dati all'archivio dati.

Passaggi successivi

Prendi in considerazione questi modelli nel tuo design per la coreografia: