Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
I grani hanno identità logiche stabili. Possono essere attivati (istanziati) e disattivati molte volte durante la vita dell'applicazione, ma al massimo esiste un'attivazione di un grano in qualsiasi momento. Ogni volta che un granello viene attivato, potrebbe essere posizionato in un silo diverso nel cluster. Quando un grano viene attivato nel cluster, si registra nella directory dei grani. In questo modo, le chiamate successive di quel grain vengono indirizzate a quella attivazione e impediscono la creazione di altre attivazioni (istanze) di quel grain. La directory dei grain è responsabile del mantenimento di una mappatura tra un'identità di grain e la posizione (quale silo) della sua attivazione corrente.
Per impostazione predefinita, Orleans usa una directory incorporata in memoria distribuita. Questa directory è infine coerente e partizionata in tutti i silo nel cluster sotto forma di tabella hash distribuita.
A partire dalla versione 3.2.0, Orleans supporta anche le implementazioni personalizzabili della directory dei grain.
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 quale implementazione della directory dei grain utilizzare in base al tipo di grain, e si può persino iniettare la propria implementazione.
Quale directory di granularità è consigliabile usare?
È consigliabile iniziare sempre con la directory predefinita (la directory distribuita integrata nella memoria). Anche se alla fine è coerente e consente occasionalmente attivazioni duplicate quando il cluster è instabile, la directory predefinita è autonoma, non ha dipendenze esterne, non richiede alcuna configurazione ed è stata usata correttamente nell'ambiente di produzione sin dall'inizio.
Quando si ha esperienza con Orleans e si ha un caso d'uso che richiede una garanzia più forte di attivazione singola, o se si vuole ridurre al minimo il numero di grani disattivati quando si arresta un silo, prendere in considerazione l'utilizzo di un'implementazione della directory di grani basata su archiviazione, come l'implementazione di Redis. Prova a usarlo inizialmente per uno o pochi tipi di grani, a partire da quelli che vivono a lungo, con stato significativo o con un processo di inizializzazione costoso.
Configurazione
Per impostazione predefinita, non è necessario eseguire alcuna operazione; Orleans usa automaticamente la directory in memoria e la distribuisce attraverso il cluster. Se si vuole usare una configurazione della directory non predefinita, è necessario specificare il nome del plug-in di directory da usare. È possibile eseguire questa operazione tramite un attributo nella classe grain e configurando il plug-in di directory con tale nome usando l'inserimento delle dipendenze durante la configurazione del silo.
Configurazione granulare
Specificare il nome del plug-in della directory granulare usando :GrainDirectoryAttribute
[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Configurazione del silo
Ecco come configurare l'implementazione della directory granulare Redis:
siloBuilder.AddRedisGrainDirectory(
"my-grain-directory",
options => options.ConfigurationOptions = redisConfiguration);
Configurare la directory granulare di Azure come segue:
siloBuilder.AddAzureTableGrainDirectory(
"my-grain-directory",
options => options.ConnectionString = azureConnectionString);
È possibile configurare più directory con nomi diversi da usare con 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);