Orleans-Grain-Verzeichnis

Grains haben stabile logische Identitäten und werden möglicherweise während der Lebensdauer der Anwendung mehrmals aktiviert (instanziiert) und deaktiviert, aber es gibt zu jedem Zeitpunkt höchstens eine Aktivierung von Grain. Jedes Mal, wenn ein Grain aktiviert wird, kann es in einem anderen Silo im Cluster platziert werden. Wenn ein Grain im Cluster aktiviert wird, wird es in der globalen Registrierung, dem Grain-Verzeichnis, registriert. Dadurch wird sichergestellt, dass nachfolgende Aufrufe dieses Grains an diese Aktivierung des Grains übermittelt werden und dass keine weiteren Aktivierungen (Instanzen) dieses Grains erstellt werden. Das Grain-Verzeichnis ist für die Beibehaltung einer Zuordnung zwischen einer Grain-Identität und dem Speicherort (welches Silo) der aktuellen Aktivierung zuständig.

Standardmäßig verwendet Orleans ein integriertes verteiltes In-Memory-Verzeichnis. Dieses Verzeichnis ist letztendlich konsistent und über alle Silos im Cluster in Form einer verteilten Hashtabelle partitioniert.

Ab Version 3.2.0 unterstützt Orleans auch austauschbare Implementierungen des Grain-Verzeichnisses.

Zwei solche Plug-Ins sind im Release 3.2.0 enthalten:

Sie können für jeden Graintyp konfigurieren, welche Grain-Verzeichnisimplementierung verwendet werden soll, und Sie können sogar Ihre Implementierung einschleusen.

Welches Grain-Verzeichnis sollten Sie verwenden?

Es wird empfohlen, immer mit dem Standardverzeichnis (integriertes verteiltes In-Memory-Verzeichnis) zu beginnen. Obwohl es letztendlich konsistent ist und eine gelegentliche doppelte Aktivierung ermöglicht, wenn der Cluster instabil ist, ist das integrierte Verzeichnis autark, ohne externe Abhängigkeiten, erfordert keine Konfiguration und wurde die ganze Zeit über in der Produktion verwendet.

Wenn Sie Erfahrung mit Orleans und einen Anwendungsfall für ein Grain-Verzeichnis mit einer stärkeren Garantie für Einzelaktivierung haben und/oder die Anzahl von Grain minimieren möchten, die beim Herunterfahren eines Silos im Cluster deaktiviert werden, sollten Sie eine speicherbasierte Implementierung des Grain-Verzeichnisses wie die Redis-Implementierung in Erwägung ziehen. Versuchen Sie es zunächst für einen oder mehrere Graintypen zu verwenden, beginnend mit den langlebigen und denen, die eine erhebliche Menge an Status oder einen aufwändigen Initialisierungsprozess haben.

Konfiguration

Standardmäßig müssen Sie nichts tun. Das In-Memory-Grain-Verzeichnis wird automatisch verwendet und über den Cluster partitioniert. Wenn Sie eine nicht standardmäßige Grain-Verzeichniskonfiguration verwenden möchten, müssen Sie den Namen des zu verwendenden Verzeichnis-Plug-Ins angeben. Dies kann über ein Attribut für die Grain-Klasse und mit Abhängigkeitseinschleusung und dem Verzeichnis-Plug-In mit dem betreffenden Namen während der Silokonfiguration erfolgen.

Grainkonfiguration

Geben Sie den Namen des Grain-Verzeichnis-Plug-Ins mit dem GrainDirectoryAttribute an:

[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

Silokonfiguration

Hier konfigurieren wir die Implementierung des Redis Grain-Verzeichnisses:

siloBuilder.AddRedisGrainDirectory(
    "my-grain-directory",
    options => options.ConfigurationOptions = redisConfiguration);

Das Azure Grain-Verzeichnis wird folgendermaßen konfiguriert:

siloBuilder.AddAzureTableGrainDirectory(
    "my-grain-directory",
    options => options.ConnectionString = azureConnectionString);

Sie können mehrere Verzeichnisse mit unterschiedlichen Namen konfigurieren, die für verschiedene Grainklassen verwendet werden sollen:

siloBuilder
    .AddRedisGrainDirectory(
        "redis-directory-1",
        options => options.ConfigurationOptions = redisConfiguration1)
    .AddRedisGrainDirectory(
        "redis-directory-2",
        options => options.ConfigurationOptions = redisConfiguration2)
    .AddAzureTableGrainDirectory(
        "azure-directory",
        options => options.ConnectionString = azureConnectionString);