Compartir a través de


Directorio de granos de Orleans

Los granos tienen identidades lógicas estables. Pueden activarse (instanciarse) y desactivarse repetidamente durante la vida útil de la aplicación, pero como mucho existe una activación de una tarea en un momento dado. Cada vez que se activa un grano, puede colocarse en un silo diferente en el clúster. Cuando se activa un grano en el clúster, se registra en el directorio de granos. Esto garantiza las invocaciones posteriores de ese grano que se entregan a esa activación y evita la creación de otras activaciones (instancias) de ese grano. El directorio de granos es responsable de mantener un mapeo entre una identidad de grano y la ubicación (qué silo) de su activación actual.

Orleans proporciona varias implementaciones de directorio específicas:

Directorio Package Description
Distribuido en clúster (valor predeterminado) Integrada Eventualmente coherente, particionado entre silos mediante una tabla hash distribuida. Permite activaciones duplicadas ocasionales durante la inestabilidad del clúster.
Fuertemente Consistente en el Clúster Integrada Tabla hash distribuida con consistencia fuerte y bloqueos de rango por versiones. Evita las activaciones duplicadas, pero requiere más coordinación.
ADO.NET Microsoft.Orleans.GrainDirectory.AdoNet Directorio respaldado por base de datos que admite SQL Server, PostgreSQL, MySQL y Oracle.
Azure Table Storage Microsoft.Orleans.GrainDirectory.AzureStorage Directorio respaldado por tablas de Azure para ubicaciones de grano persistentes.
Redis Microsoft.Orleans.GrainDirectory.Redis Directorio respaldado por Redis para búsquedas persistentes de alto rendimiento.

De forma predeterminada, Orleans utiliza un directorio integrado distribuido dentro del clúster. Este directorio es finalmente coherente y particionado en todos los silos del clúster en forma de una tabla hash distribuida.

A partir de la versión 3.2.0, Orleans también admite implementaciones de directorios de grano conectables.

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 con el directorio predeterminado (el directorio integrado distribuido en clúster). Aunque es coherente con el tiempo y permite activaciones duplicadas ocasionales cuando el clúster es inestable, el directorio integrado es autoadministrable, no tiene dependencias externas, no requiere ninguna configuración y se ha usado correctamente en producción desde el principio.

Si tiene alguna experiencia con Orleans y tiene un caso de uso que requiere una garantía de activación única más fuerte, o si desea minimizar el número de granos desactivados cuando se cierra un silo, considere la posibilidad de usar una implementación de directorio de granos basada en almacenamiento, como la implementación de Redis. Pruebe a usarlo primero para uno o algunos tipos de granos, empezando por aquellos que son de larga duración, tengan un estado significativo o tengan un proceso de inicialización costoso.

Directorio fuertemente consistente en clúster

Importante

Esta característica está disponible a partir Orleans de la versión 10.0. Actualmente está en versión preliminar y puede cambiar en futuras versiones.

Orleans también proporciona un directorio de grano fuertemente coherente mediante una tabla hash distribuida con nodos virtuales (similar a Amazon Dynamo y Apache Cassandra). A diferencia del directorio predeterminado eventualmente consistente, esta implementación evita las activaciones duplicadas de grain incluso cuando hay inestabilidad en el clúster.

Características clave

  • Coherencia fuerte: utiliza bloqueos de rango versionados en los cambios de vista para garantizar la coherencia.
  • Nodos virtuales: cada silo administra 30 nodos virtuales (particiones) en el anillo hash para una mejor distribución
  • Recuperación automática: se recupera automáticamente cuando los silos fallan sin completar la transferencia
  • Operación en dos fases: funciona en fase normal y fase de cambio de vista para transiciones de pertenencia seguras

Configuración

Para usar el directorio fuertemente coherente, agréguelo explícitamente mediante AddDistributedGrainDirectory:

// Use as the default grain directory
builder.AddDistributedGrainDirectory();

// Or add as a named directory
builder.AddDistributedGrainDirectory("MyDistributedDirectory");

Cuándo usar

Utilice el directorio fuertemente coherente cuando necesite evitar activaciones duplicadas de granos durante los cambios de pertenencia al clúster. El directorio predeterminado coherente con el tiempo es adecuado para la mayoría de los escenarios en los que se admiten activaciones duplicadas ocasionales.

Considere los directorios con respaldo de almacenamiento externo (Redis, Azure Table, ADO.NET) cuando:

  • Necesita que los registros de granos persistan en los reinicios completos del clúster.
  • Tiene clústeres muy grandes en los que el uso de memoria es un problema

directorio de granos de ADO.NET

El directorio de granos basado en ADO.NET almacena ubicaciones de granos en una base de datos relacional. Esto proporciona almacenamiento persistente de la ubicación de grano que sobrevive a los reinicios del clúster.

Bases de datos admitidas

  • SQL Server
  • PostgreSQL
  • MySQL/MariaDB
  • Oracle

Installation

Instale el paquete NuGet:

dotnet add package Microsoft.Orleans.GrainDirectory.AdoNet

Configuración

Configure el directorio de granos de ADO.NET como predeterminado o como un directorio nombrado.

// Use as the default grain directory
builder.UseAdoNetGrainDirectoryAsDefault(options =>
{
    options.Invariant = "System.Data.SqlClient"; // or "Npgsql", "MySql.Data.MySqlClient"
    options.ConnectionString = "Server=localhost;Database=Orleans;...";
});

// Or add as a named directory
builder.AddAdoNetGrainDirectory("MyAdoNetDirectory", options =>
{
    options.Invariant = "Npgsql";
    options.ConnectionString = "Host=localhost;Database=Orleans;...";
});

AdoNetGrainDirectoryOptions

Opción Tipo Description
Invariant string Obligatorio. Nombre invariable del proveedor de ADO.NET (por ejemplo, System.Data.SqlClient, Npgsql, MySql.Data.MySqlClient).
ConnectionString string Obligatorio. Cadena de conexión de base de datos. Este valor se redacta en los registros.

Configuración de la base de datos

Antes de usar el directorio de grain de ADO.NET, debe crear las tablas de base de datos requeridas. Ejecute el script SQL adecuado para la base de datos:

Configuración

De forma predeterminada, no es necesario hacer nada; Orleans usa automáticamente el directorio de granos dentro del clúster y lo particiona en todo el clúster. Si desea usar una configuración de directorio específico no predeterminada, debe especificar el nombre del complemento de directorio que se va a usar. Puede hacerlo a través de un atributo en la clase de grano y configurando el complemento de directorio con ese nombre mediante la inserción de dependencias durante la configuración del silo.

Configuración del grano

Especifique el nombre del plugin de directorio de grano usando GrainDirectoryAttribute:

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

Configuración del silo

Aquí se muestra cómo configurar la implementación del directorio de granos de Redis:

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

Configura el directorio de granos de Azure así:

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

Puede configurar varios directorios con nombres diferentes para su uso con diferentes 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);