Directorio de granos de Orleans

Los granos tienen identidades lógicas estables y pueden activarse (crear instancias) y desactivarse muchas veces durante la vida de la aplicación, pero como máximo hay una activación de grano en cualquier momento. Cada vez que se activa un grano, se puede colocar en un silo diferente del clúster. Cuando se activa un grano en el clúster, se registra en el registro global, directorio de granos. Esto garantiza que las invocaciones posteriores de ese grano se entreguen a esa activación del grano y que no se creen otras activaciones (instancias) de ese grano. El directorio de granos es responsable de mantener una asignación entre una identidad de grano y dónde (qué silo) está su activación actual.

De manera predeterminada, Orleans usa un directorio distribuido en memoria integrado. Este directorio al final es coherente y está particionado en todos los silos del clúster en forma de tabla hash distribuida.

A partir de la versión 3.2.0, Orleans también admite implementaciones conectables del directorio de granos.

En la versión 3.2.0 se incluyen dos complementos de este tipo:

Puede configurar qué implementación de directorio de granos se va a usar por tipo de grano, e incluso puede insertar su implementación.

Directorio de granos que se debe usar

Se recomienda comenzar siempre por el predeterminado (directorio distribuido integrado en memoria). Aunque al final es coherente y permite la activación ocasional de duplicados cuando el clúster es inestable, el directorio integrado es autosuficiente sin dependencias externas, no requiere ninguna configuración y se ha usado en producción todo el tiempo.

Cuando tenga algo de experiencia con Orleans y disponga de un caso de uso para el directorio de granos con una garantía de activación única más sólida o quiera minimizar el número de granos que se desactivan cuando se cierra un silo del clúster, considere la posibilidad de usar una implementación basada en almacenamiento del directorio de granos, como la implementación de Redis. Pruebe a usarlo primero en uno o algunos tipos de grano, empezando por aquellos que son de larga duración y tienen una cantidad considerable de estado o un proceso de inicialización costoso.

Configuración

De manera predeterminada, no tiene que hacer nada; el directorio de granos en memoria se usa automáticamente y se particiona en el clúster. Si quiere usar una configuración de directorio de granos no predeterminada, debe especificar el nombre del complemento de directorio que se va a usar. Esto se puede hacer mediante un atributo en la clase de grano y con la inserción de dependencias y el complemento de directorio con ese nombre durante la configuración del silo.

Configuración del grano

Especificación del nombre del complemento del directorio de granos con GrainDirectoryAttribute:

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

Configuración del silo

Aquí se configura la implementación del directorio de granos de Redis:

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

El directorio de granos de Azure está configurado de la siguiente manera:

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

Puede configurar varios directorios con nombres diferentes para usarlos con distintas clases de grano:

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