Microsoft Orleans
Orleans:
- È un framework multipiattaforma per la creazione di app distribuite affidabili e scalabili. Le app distribuite sono definite come app che si estendono su più processi, spesso oltre i limiti hardware, usando la comunicazione peer-to-peer.
- Scalabilità da un singolo server locale a migliaia di app distribuite a disponibilità elevata nel cloud.
- Estende i concetti familiari e i linguaggi C# agli ambienti multiserver.
- È progettato per la scalabilità elastica. Quando un host viene aggiunto a un cluster, può accettare nuove attivazioni. Quando un host esce dal cluster, le attivazioni precedenti su tale host verranno riattivate negli host rimanenti in base alle necessità. Un host può abbandonare un cluster a causa di un ridimensionamento o di un errore del computer. Un cluster Orleans può essere ridotto a un singolo host. Le stesse proprietà che abilitano la scalabilità elastica abilitano la tolleranza di errore. Il cluster rileva automaticamente gli errori e il corregge rapidamente.
- Semplifica le complessità dello sviluppo di app distribuite fornendo un set comune di modelli e API.
- Consente agli sviluppatori che hanno familiarità con lo sviluppo di app a server singolo di passare facilmente alla compilazione di servizi nativi del cloud resilienti e scalabili e di app distribuite.
- A volte viene chiamato "Distributed .NET".
- Framework di scelta per la creazione di app native del cloud.
- Viene eseguito in qualsiasi ambiente sia supportato .NET. inclusi Linux, Windows e macOS.
- Le app possono essere distribuite in Kubernetes, macchine virtuali e servizi PaaS, ad esempio Servizio app di Azure e App contenitore di Azure.
Il "modello attore"
Orleans è basato sul "modello attore". Il modello attore è nato nei primi anni '70 del secolo scorso ed è ora un componente principale di Orleans. Si tratta di un modello di programmazione in cui ogni attore è un oggetto leggero, simultaneo e non modificabile che incapsula uno stato e il comportamento corrispondente. Gli attori comunicano esclusivamente tra loro tramite messaggi asincroni. Orleans ha in particolare inventato l'astrazione Attore virtuale, in cui gli attori esistono in modo perpetuo.
Nota
Gli attori sono entità puramente logiche che esistono sempre, a livello virtuale. Un attore non può essere creato né eliminato definitivamente in modo esplicito e la sua esistenza virtuale non è influenzata dall'errore di un server che lo esegue. Poiché gli attori esistono sempre, sono sempre indirizzabili.
Questo è un nuovo approccio alla compilazione di una nuova generazione di app distribuite per l'era del cloud. Il modello di programmazione di Orleans riduce la complessità delle app distribuite altamente parallele senza limitare le capacità o imporre vincoli allo sviluppatore.
Per altre informazioni, vedere Orleans: Attori virtuali su Microsoft Research. Un attore virtuale è rappresentato come un grano di Orleans.
Che cosa sono i grain?
Il grano è uno dei diversi elementi primitivi di Orleans. Nell'ambito del modello attore, un grano è un attore virtuale. Il componente di base fondamentale di qualsiasi applicazione di Orleans è un grano. I grani sono entità che comprendono identità definita dall'utente, comportamento e stato. Di seguito è riportata la rappresentazione grafica di un grano:
Le identità dei grani sono chiavi definite dall'utente che rendono i grani sempre disponibili per la chiamata. I grani possono essere richiamati da altri grani o da un numero qualsiasi di client esterni. Ogni grano è un'istanza di una classe che implementa una o più delle interfacce seguenti:
- IGrainWithGuidKey: interfaccia dei marcatori per grani con chiavi
Guid
. - IGrainWithIntegerKey: interfaccia dei marcatori per grani con chiavi
Int64
. - IGrainWithStringKey: interfaccia dei marcatori per grani con chiavi
string
. - IGrainWithGuidCompoundKey: interfaccia dei marcatori per grani con chiavi composte.
- IGrainWithIntegerCompoundKey: interfaccia dei marcatori per grani con chiavi composte.
I grani possono avere dati di stato volatili o persistenti che possono essere archiviati in qualsiasi sistema di archiviazione. In quanto tali, i grani partizionano implicitamente gli stati delle applicazioni, consentendo la scalabilità automatica e semplificando il ripristino dagli errori. Lo stato dei grani viene mantenuto in memoria mentre il grano è attivo, con conseguente riduzione della latenza e del carico negli archivi dati.
La creazione di istanze dei grani viene eseguita automaticamente su richiesta dal runtime di Orleans. I grani che non vengono usati per un certo periodo vengono automaticamente rimossi dalla memoria per liberare risorse. Ciò è possibile grazie alla loro identità stabile, che consente di richiamare i grani indipendentemente dal fatto che siano già caricati in memoria o meno. Questo permette anche un recupero trasparente dagli errori, poiché il chiamante non ha bisogno di sapere su quale server viene creata un'istanza di un grano in qualsiasi momento. I grani hanno un ciclo di vita gestito, con il runtime di Orleans responsabile dell'attivazione/disattivazione e del posizionamento/individuazione dei grani in base alle esigenze. In questo modo lo sviluppatore può scrivere codice come se tutti i grani fossero sempre in memoria.
Che cosa sono i silos?
Un silo è un altro esempio di elemento primitivo di Orleans. Un silo ospita uno o più grani. Il runtime di Orleans implementa il modello di programmazione per le applicazioni.
In genere, un gruppo di silos viene eseguito come cluster per garantire la scalabilità e la tolleranza di errore. Quando il gruppo viene eseguito come cluster, i silos si coordinano tra loro per distribuire il lavoro, oltre a rilevare gli errori e correggerli. Il runtime consente ai grani ospitati nel cluster di comunicare tra loro come se fossero all'interno di un unico processo. Il diagramma seguente offre una rappresentazione grafica della relazione tra cluster, silos e grani:
Il diagramma riportato sopra mostra la relazione tra cluster, silos e grani. Il numero di cluster supportato è illimitato, ogni cluster contiene uno o più silos e ogni silo contiene uno o più grani.
Oltre al modello di programmazione di base, i silos forniscono ai grani un insieme di servizi di runtime, come timer, promemoria (timer persistenti), persistenza, transazioni, flussi e altro ancora. Per altre informazioni, vedere Cosa si può fare con Orleans?
Le app Web e altri client esterni chiamano i grani nel cluster usando la libreria client, che gestisce automaticamente la comunicazione di rete. Per semplicità, i client possono anche essere ospitati nello stesso processo con i silos.
Cosa si può fare con Orleans?
Orleans è un framework per la compilazione di app native del cloud e dovrebbe essere preso in considerazione ogni volta che si creano app .NET che prima o poi dovranno essere ridimensionate. Orleans si presta a innumerevoli utilizzi, ma alcuni dei più comuni sono: giochi, servizi bancari, app di chat, tracciamento GPS, compravendita di azioni, carrelli della spesa, app di voto e altro ancora. Orleans viene usato da Microsoft in Azure, Xbox, Skype, Halo, PlayFab, Gears of War e molti altri servizi interni. Orleans offre molte funzionalità che ne semplificano l'uso per un'ampia gamma di applicazioni.
Persistenza
Orleans fornisce un semplice modello di persistenza che garantisce che lo stato sia disponibile prima dell'elaborazione di una richiesta e che ne venga mantenuta la coerenza. I grani possono contenere più oggetti dati persistenti denominati. Ad esempio, potrebbe essere presente un oggetto denominato "profile" per il profilo di un utente e un oggetto denominato "inventory" per l'inventario. Questo stato può essere archiviato in qualsiasi sistema di archiviazione.
Durante l'esecuzione di un grano, lo stato viene mantenuto in memoria in modo che le richieste di lettura possano essere gestite senza accedere allo spazio di archiviazione. Quando il grano aggiorna il proprio stato, la chiamata a IStorage.WriteStateAsync garantisce che l'archivio di backup venga aggiornato per garantire la durabilità e la coerenza.
Per altre informazioni, vedere Persistenza dei grani.
Timer e promemoria
I promemoria sono un meccanismo di pianificazione durevole per i grani. Possono essere usati per assicurarsi che alcune azioni vengano completate in un momento futuro anche se il grano non è attivato in quel momento. I timer sono la controparte non durevole dei promemoria e possono essere usati per eventi molto frequenti, per i quali l'affidabilità non è un requisito.
Per altre informazioni, vedere Timer e promemoria.
Posizionamento flessibile dei grani
Quando viene attivato un grano in Orleans, è il runtime a decidere su quale server (silo) attivarlo. Questo processo è detto posizionamento del grano.
Il processo di posizionamento in Orleans è completamente configurabile. Gli sviluppatori possono scegliere tra un set di criteri di posizionamento predefiniti, ad esempio casuale, preferibilmente locale e in base al carico, oppure possono configurare la logica personalizzata. Questo assicura la massima flessibilità nel decidere dove creare i grani. Ad esempio, i grani possono essere posizionati su un server vicino alle risorse su cui devono operare o ad altri grani con cui devono comunicare.
Per altre informazioni, vedere Posizionamento dei grani.
Controllo delle versioni dei grani e cluster eterogenei
Aggiornare i sistemi di produzione in modo da tenere conto delle modifiche in modo sicuro può essere impegnativo, soprattutto nei sistemi con stato. Per gestire questo aspetto, le interfacce dei grani in Orleans supportano il controllo delle versioni.
Il cluster gestisce un mapping delle implementazioni dei grani disponibili nei vari silos del cluster e delle versioni di tali implementazioni. Questa versione delle informazioni viene usata dal runtime insieme alle strategie di posizionamento per prendere decisioni di posizionamento durante il routing delle chiamate ai grani. Inoltre, per aggiornare in modo sicuro un grano con controllo delle versioni, è possibile anche creare cluster eterogenei, in cui i diversi silos hanno diversi set di implementazioni di grani disponibili.
Per altre informazioni, vedere Controllo delle versioni dei grani.
Ruoli di lavoro senza stato
I ruoli di lavoro senza stato sono grani contrassegnati in modo specifico a cui non è associato uno stato e che possono essere attivati contemporaneamente in più silos. Questo consente un maggiore parallelismo per le funzioni senza stato.
Per altre informazioni, vedere Grani di ruoli di lavoro senza stato.
Filtri di chiamata dei grani
Un filtro di chiamata dei grani è una logica comune a molti grani. Orleans supporta i filtri per le chiamate sia in ingresso che in uscita. I filtri per l'autorizzazione, la registrazione, la telemetria e la gestione degli errori sono considerati comuni.
Contesto della richiesta
I metadati e altre informazioni possono essere passati con una serie di richieste usando il contesto della richiesta. Il contesto della richiesta può essere usato per contenere le informazioni sulla traccia distribuita o qualsiasi altro valore definito dall'utente.
Transazioni ACID distribuite
Oltre al modello di persistenza semplice descritto in precedenza, i grani possono avere uno stato transazionale. Più grani possono partecipare a transazioni ACID indipendentemente dalla posizione in cui è archiviato il loro stato. Le transazioni in Orleans sono distribuite e decentralizzate (non esiste un gestore transazioni centrale o un coordinatore delle transazioni) e sono caratterizzate da isolamento serializzabile.
Per altre informazioni sulle transazioni, vedere Transazioni.
Flussi
I flussi consentono agli sviluppatori di elaborare una serie di elementi di dati quasi in tempo reale. I flussi di Orleans sono gestiti; non è necessario crearli o registrarli prima che un grano o un client pubblichi o sottoscriva un flusso. Ciò consente una maggiore separazione dei produttori e dei consumer di flussi tra loro e con l'infrastruttura.
L'elaborazione dei flussi è affidabile: i grani possono archiviare checkpoint (cursori) e reimpostare un checkpoint archiviato durante l'attivazione o in qualsiasi momento successivo. I flussi supportano il recapito in batch dei messaggi ai consumer per migliorare l'efficienza e le prestazioni di ripristino.
I flussi sono supportati da servizi di accodamento come Hub eventi di Azure, Amazon Kinesis e altri.
Un numero arbitrario di flussi può essere sottoposto a multiplexing in un numero inferiore di code e la responsabilità dell'elaborazione di queste code viene bilanciata in modo uniforme nel cluster.
Video introduttivo su Orleans
Per un'introduzione a Orleans, guardare il video seguente: