Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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:
- Una implementación de tabla de Azure: Microsoft.Orleans.GrainDirectory.AzureStorage
- Una implementación de almacén de Redis: Microsoft.Orleans.GrainDirectory.Redis
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:
- SQL Server: CreateOrleansTables_SqlServer.sql
- PostgreSQL: CreateOrleansTables_PostgreSql.sql
- MySQL: CreateOrleansTables_MySql.sql
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);