Directory granulare Orleans
I grani hanno identità logiche stabili e possono essere attivate (può esserne creata un'istanza) e disattivate molte volte nella vita dell'applicazione,ma esiste al massimo un'attivazione di grani in qualsiasi momento. Ogni volta che un grano viene attivato, può essere posizionato su un silo diverso nel cluster. Quando un grano viene attivato nel cluster, viene registrato nel Registro di sistema globale, directory dei grani. In questo modo si garantisce che le chiamate successive di tale granularità verranno recapitate a tale attivazione della granularità, e che non verranno create altre attivazioni (istanze) di tale granularità. La directory granulare è responsabile della conservazione di un mapping tra un'identità granulare e di dove (quale silo) si trova l'attivazione corrente.
Per impostazione predefinita, Orleans usa una directory in memoria distribuita predefinita. Questa directory è infine coerente e partizionata in tutti i silo del cluster sotto forma di tabella hash distribuita.
A partire dalla versione 3.2.0, Orleans supporta anche implementazioni collegabili di directory granulari.
Due plug-in di questo tipo sono inclusi nella versione 3.2.0:
- Implementazione della tabella di Azure: Microsoft.Orleans. GrainDirectory.AzureStorage
- Implementazione dell'archivio Redis: Microsoft.Orleans. GrainDirectory.Redis
È possibile configurare l'implementazione della directory granulare da usare in base al tipo di granularità ed è anche possibile inserire l'implementazione.
Quale directory di granularità è consigliabile usare?
È consigliabile iniziare sempre con quella predefinita (directory distribuita in memoria predefinita). Anche se alla fine è coerente e consente occasionalmente l'attivazione duplicata quando il cluster è instabile, la directory predefinita è autonoma senza dipendenze esterne, non richiede alcuna configurazione ed è stata usata nell'intero periodo di produzione.
Quando si ha esperienza con Orleans e si ha un caso d'uso per una directory granulare con garanzia di attivazione singola più avanzata e/o si vuole ridurre al minimo il numero di granularità che viene disattivato quando un silo nel cluster si arresta, prendere in considerazione l'uso di un'implementazione basata sull'archiviazione della directory granulare, ad esempio l'implementazione di Redis. Provare prima a usarlo per uno o pochi tipi di granularità, a partire da quelli di lunga durata e che hanno una quantità significativa di stato o un processo di inizializzazione costoso.
Impostazione
Per impostazione predefinita, non è necessario eseguire alcuna operazione; la directory con granularità in memoria verrà usata e partizionata automaticamente nel cluster. Se si vuole usare una configurazione della directory non predefinita, è necessario specificare il nome del plug-in di directory da usare. Questa operazione può essere eseguita tramite un attributo sulla classe dei grani, e con l'inserimento delle dipendenze e il plug-in di directory con tale nome durante la configurazione del silo.
Configurazione granulare
Specifica del nome del plug-in della directory granulare con GrainDirectoryAttribute:
[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Configurazione del silo
Qui viene configurata l'implementazione della directory granulare Redis:
siloBuilder.AddRedisGrainDirectory(
"my-grain-directory",
options => options.ConfigurationOptions = redisConfiguration);
La directory granulare di Azure è configurata come segue:
siloBuilder.AddAzureTableGrainDirectory(
"my-grain-directory",
options => options.ConnectionString = azureConnectionString);
È possibile configurare più directory con nomi diversi da usare per classi di granularità diverse:
siloBuilder
.AddRedisGrainDirectory(
"redis-directory-1",
options => options.ConfigurationOptions = redisConfiguration1)
.AddRedisGrainDirectory(
"redis-directory-2",
options => options.ConfigurationOptions = redisConfiguration2)
.AddAzureTableGrainDirectory(
"azure-directory",
options => options.ConnectionString = azureConnectionString);