Répertoire de grain Orleans

Les grains ont des identités logiques stables et peuvent être activés (instanciés) et désactivés plusieurs fois pendant la durée de vie de l’application, mais une activation de grain au plus existe à tout moment. Chaque fois qu’un grain est activé, il peut être placé dans un autre silo, dans le cluster. Quand un grain est activé dans le cluster, il est inscrit dans le registre global, le répertoire de grain. Cela garantit que les appels suivants de ce grain seront remis à cette activation du grain et qu’aucune autre activation (instance) de ce grain ne sera créée. Le répertoire de grain est chargé de conserver un mappage entre une identité de grain et l’emplacement (le silo) de son activation actuelle.

Par défaut, Orleans utilise un répertoire en mémoire distribué et intégré. Ce répertoire est finalement cohérent et partitionné entre tous les silos du cluster sous la forme d’une table de hachage distribuée.

À compter de la version 3.2.0, Orleans prend également en charge les implémentations enfichables du répertoire de grain.

Deux plug-ins de ce type sont inclus dans la version 3.2.0 :

Vous pouvez configurer l’implémentation de répertoire de grain à utiliser sur une base de type par grain, et vous pouvez même injecter votre implémentation.

Quel répertoire de grain devez-vous utiliser ?

Nous vous recommandons de toujours commencer par la valeur par défaut (répertoire distribué intégré en mémoire). Même s’il est finalement cohérent et permet une activation en double occasionnelle lorsque le cluster est instable, le répertoire intégré est autonome sans dépendances externes, ne nécessite aucune configuration et a été utilisé en production tout le temps.

Si vous avez une certaine expérience avec Orleans et que vous avez un cas d’usage pour le répertoire de grain avec une garantie d’activation unique plus forte et/ou que vous souhaitez réduire au maximum le nombre de grains qui sont désactivés quand un silo du cluster s’arrête, envisagez d’utiliser une implémentation basée sur le stockage du répertoire de grain, comme l’implémentation Redis. Essayez de l’utiliser pour un ou plusieurs types de grain en commençant par ceux qui sont durables et qui ont une quantité importante d’état ou un processus d’initialisation coûteux.

Configuration

Par défaut, vous n’avez rien à faire. Le répertoire de grain en mémoire sera automatiquement utilisé et partitionné sur le cluster. Si vous souhaitez utiliser une configuration de répertoire de grain autre que celle définie par défaut, vous devez spécifier le nom du plug-in de répertoire à utiliser. Cela est possible via un attribut sur la classe de grain et avec l’injection de dépendances et le plug-in de répertoire portant ce nom pendant la configuration du silo.

Configuration du grain

Spécification du nom du plug-in de répertoire de grain avec GrainDirectoryAttribute :

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

Configuration du silo

Ici, nous configurons l’implémentation du répertoire de grain Redis :

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

Le répertoire de grain Azure est configuré comme suit :

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

Vous pouvez configurer plusieurs répertoires avec différents noms à utiliser pour différentes classes de grain :

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