Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
I principali vantaggi di Orleans sono:
- Produttività degli sviluppatori: anche per i programmatori non esperti.
- Scalabilità trasparente per impostazione predefinita: non richiede alcun impegno particolare da parte dello sviluppatore.
Produttività degli sviluppatori
Il Orleans modello di programmazione aumenta la produttività, indipendentemente dal livello di competenza, fornendo le astrazioni chiave, le garanzie e i servizi di sistema seguenti.
Paradigma di programmazione orientata agli oggetti (OOP) familiare
I grani sono classi .NET che implementano interfacce di granularità .NET dichiarate con metodi asincroni. I grani vengono visualizzati come oggetti remoti i cui metodi possono essere richiamati direttamente. Questo fornisce il familiare paradigma OOP trasformando le invocazioni di metodo in messaggi, indirizzandole agli endpoint corretti, richiamando i metodi del grano di destinazione e gestendo in modo trasparente gli errori e i casi limite.
Esecuzione a thread singolo di grani
Il runtime garantisce che una granularità non venga mai eseguita su più thread alla volta. In combinazione con l'isolamento di altri grani, gli sviluppatori non devono mai affrontare la concorrenza a livello di granularità e non hanno mai bisogno di blocchi o altri meccanismi di sincronizzazione per controllare l'accesso ai dati condivisi. Questa funzionalità rende da solo lo sviluppo di applicazioni distribuite trattabili, anche per programmatori non esperti.
Attivazione trasparente
Il runtime attiva un'entità solo quando c'è un messaggio da elaborare. Questo separa in modo pulito la creazione di un riferimento granulare (controllato dal codice dell'applicazione) e l'attivazione fisica della granularità in memoria (trasparente per l'applicazione). È simile alla memoria virtuale in cui il sistema operativo decide quando inserire pagine in memoria e quando rimuovere le pagine dalla memoria. Analogamente, in Orleans, il runtime decide quando attivare un granulare (portandolo in memoria) e quando disattivare un granulare (rimuovendolo dalla memoria). L'applicazione ha accesso ininterrotto all'intero "spazio di memoria" dei grani creati logicamente, indipendentemente dal fatto che si trovino in memoria fisica in un determinato momento.
L'attivazione trasparente consente il bilanciamento del carico dinamico e adattivo tramite posizionamento e migrazione di grani nel pool di risorse hardware. Questa funzionalità migliora significativamente il modello di attore tradizionale, in cui la durata dell'attore è gestita dall'applicazione.
Trasparenza della posizione
Un riferimento a un grain (oggetto proxy) usato per richiamare i metodi di un grain o passare ad altri componenti contiene solo l'identità logica del grain. Il Orleans runtime gestisce in modo trasparente la traduzione dell'identità logica del grain verso la sua localizzazione fisica e l'indirizzamento dei messaggi di conseguenza.
Il codice dell'applicazione comunica con grani senza conoscere la posizione fisica. Questa posizione può cambiare nel tempo a causa di errori, gestione delle risorse o perché un grano viene disattivato al momento della chiamata.
Integrazione trasparente con un archivio permanente
Orleans consente di mappare dichiarativamente lo stato in memoria di un grano a un archivio permanente. Sincronizza gli aggiornamenti, garantendo in modo chiaro che i chiamanti ricevano risultati solo dopo che lo stato persistente è stato aggiornato con successo. L'estensione e/o la personalizzazione del set di provider di archiviazione persistente esistenti è semplice.
Propagazione automatica degli errori
Il runtime propaga automaticamente gli errori non gestiti lungo la catena di chiamate con la semantica di try/catch distribuita e asincrona. Di conseguenza, gli errori non vengono persi all'interno di un'applicazione. Ciò consente di posizionare la logica di gestione degli errori in posizioni appropriate senza il lavoro noioso di propagazione manuale degli errori a ogni livello.
Scalabilità trasparente per impostazione predefinita
Il Orleans modello di programmazione guida gli sviluppatori verso il ridimensionamento corretto di applicazioni o servizi attraverso diversi ordini di grandezza. Questo risultato viene ottenuto incorporando procedure consigliate e modelli collaudati e fornendo un'implementazione efficiente delle funzionalità di sistema di livello inferiore.
Ecco alcuni fattori chiave che consentono la scalabilità e le prestazioni:
Partizionamento con granularità fine implicita dello stato dell'applicazione
L'uso di grani come entità indirizzabili direttamente suddivide in modo implicito lo stato complessivo dell'applicazione. Anche se il Orleans modello di programmazione non prevede dimensioni granulari, nella maggior parte dei casi, avere un numero relativamente elevato di grani (milioni o più) ha senso, con ognuno che rappresenta un'entità applicazione naturale, ad esempio un account utente o un ordine di acquisto.
Con i grani indirizzabili singolarmente e la loro posizione fisica astratta dal runtime, Orleans ha un'enorme flessibilità nel bilanciamento del carico e nella gestione delle aree calde in modo trasparente e generico, senza dover pensare allo sviluppatore dell'applicazione.
Gestione delle risorse adattiva
I grani non presuppongono la località di altri grani durante l'interazione. A causa di questa trasparenza della posizione, il runtime può gestire e regolare dinamicamente l'allocazione delle risorse hardware disponibili. Il runtime ottiene questo risultato prendendo decisioni dettagliate sull'inserimento e la migrazione di grani nel cluster di calcolo in reazione ai modelli di carico e di comunicazione, senza errori nelle richieste in ingresso. Creando più repliche di un particolare livello di granularità, il runtime può aumentare la velocità effettiva senza modificare il codice dell'applicazione.
Comunicazione multiplexata
I grains in Orleans hanno endpoint logici e la messaggistica tra di loro viene multiplexata in un set fisso di connessioni fisiche punto-a-punto (socket TCP). In questo modo il runtime può ospitare milioni di entità indirizzabili con un sovraccarico del sistema operativo ridotto per grano. Inoltre, l'attivazione e la disattivazione di un granulo non comportano il costo di registrazione/sregistrazione di un endpoint fisico (ad esempio una porta TCP o un URL HTTP) o anche la chiusura di una connessione TCP.
Pianificazione efficiente
Il runtime pianifica l'esecuzione di molti grani a thread singolo usando il pool di thread .NET, altamente ottimizzato per le prestazioni. Quando il codice granulare viene scritto nello stile non bloccante basato su continuazione (un requisito del Orleans modello di programmazione), il codice dell'applicazione viene eseguito in modo molto efficiente in modo multithreading "cooperativo" senza conflitti. In questo modo il sistema può ottenere una velocità effettiva elevata ed essere eseguita a un utilizzo elevato della CPU (fino a 90%+) con una grande stabilità.
Il fatto che la crescita del numero di grani e l'aumento del carico non comporti thread aggiuntivi o altre primitive del sistema operativo aiutano la scalabilità dei singoli nodi e dell'intero sistema.
Asincronia esplicita
Il Orleans modello di programmazione rende esplicita la natura asincrona delle applicazioni distribuite e guida gli sviluppatori a scrivere codice asincrono non bloccanti. In combinazione con la messaggistica asincrona e la pianificazione efficiente, ciò consente un elevato grado di parallelismo distribuito e velocità effettiva complessiva senza richiedere il multithreading esplicito.