En esta clase aprenderemos cómo utilizar Directorios en Orleans para gestionar referencias de Granos de manera eficiente y escalable.
Objetivos de la Clase
- Comprender qué son los directorios en Orleans y cómo funcionan.
- Implementar directorios personalizados para mejorar el acceso a los Granos.
- Usar directorios Orleans para optimizar la localización de Granos en un clúster.
- Probar la gestión de Granos con directorios personalizados.
¿Qué son los Directorios en Orleans?
En un sistema Orleans distribuido, los Granos pueden activarse en cualquier nodo del clúster.
Para localizarlos rápidamente, Orleans usa un Directorio de Granos que gestiona en qué nodo se encuentra cada Grano.
Beneficios de los Directorios Orleans
- Mejor rendimiento al ubicar Granos en grandes clústeres.
- Optimización de red, reduciendo llamadas innecesarias.
- Escalabilidad, permitiendo gestionar millones de Granos sin perder eficiencia.
Tipos de Directorios en Orleans
- Default Grain Directory: Se usa por defecto y distribuye Granos en el clúster.
- Custom Grain Directory: Permite definir reglas personalizadas para localizar Granos.
- Distributed Grain Directory: Mejora la escalabilidad en grandes clústeres Orleans.
Configurar un Directorio Personalizado en Orleans
1. Definir una Interfaz de Directorio
Crea IMiDirectorio.cs
en Directorios:
using System.Threading.Tasks;
using Orleans;
public interface IMiDirectorio : IGrainWithStringKey
{
Task RegistrarGrano(string clave, string nodo);
Task<string> ObtenerNodo(string clave);
}
2. Implementar el Directorio de Granos
Crea MiDirectorio.cs
en Directorios:
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using Orleans;
public class MiDirectorio : Grain, IMiDirectorio
{
private static readonly ConcurrentDictionary<string, string> _granos = new();
public Task RegistrarGrano(string clave, string nodo)
{
_granos[clave] = nodo;
return Task.CompletedTask;
}
public Task<string> ObtenerNodo(string clave)
{
_granos.TryGetValue(clave, out var nodo);
return Task.FromResult(nodo ?? "Desconocido");
}
}
Explicación del Código
- Se usa ConcurrentDictionary para almacenar la ubicación de los Granos.
RegistrarGrano(clave, nodo)
: Registra la clave de un Grano y el nodo donde se encuentra.ObtenerNodo(clave)
: Devuelve la ubicación de un Grano en el clúster.
Configurar el Directorio en Orleans
Edita Program.cs
en OrleansDemo y registra el directorio personalizado:
builder.UseOrleans(siloBuilder =>
{
siloBuilder.UseLocalhostClustering();
siloBuilder.ConfigureServices(services =>
{
services.AddSingleton<IMiDirectorio, MiDirectorio>();
});
});
Usar el Directorio para Localizar Granos
1. Definir un Grano que use el Directorio
Crea IClienteGrain.cs
en Granos:
using System.Threading.Tasks;
using Orleans;
public interface IClienteGrain : IGrainWithStringKey
{
Task<string> ObtenerNodo();
}
2. Implementar el Grano
Crea ClienteGrain.cs
en Granos:
using System.Threading.Tasks;
using Orleans;
public class ClienteGrain : Grain, IClienteGrain
{
private readonly IMiDirectorio _directorio;
public ClienteGrain(IMiDirectorio directorio)
{
_directorio = directorio;
}
public async Task<string> ObtenerNodo()
{
return await _directorio.ObtenerNodo(this.GetPrimaryKeyString());
}
}
Explicación del Código
- El Grano consulta el directorio para saber en qué nodo está ejecutándose.
Probar el Directorio en Orleans
1. Ejecutar el Silo Orleans
dotnet run
2. Probar con un Cliente Orleans
Edita Program.cs
en OrleansClient y agrega:
var cliente = new ClientBuilder()
.UseLocalhostClustering()
.Build();
await cliente.Connect();
var directorio = cliente.GetGrain<IMiDirectorio>("directorio");
await directorio.RegistrarGrano("cliente1", "Nodo-01");
var clienteGrain = cliente.GetGrain<IClienteGrain>("cliente1");
string nodo = await clienteGrain.ObtenerNodo();
Console.WriteLine($"El cliente1 está en: {nodo}");
Salida esperada
El cliente1 está en: Nodo-01
Si todo está configurado correctamente, el Grano será localizado correctamente en el clúster.
Cuestionario de Autoevaluación
- ¿Qué función cumple un Directorio en Orleans?
- ¿Cómo Orleans localiza Granos en un sistema distribuido?
- ¿Por qué un directorio personalizado puede mejorar el rendimiento de Orleans?
- ¿Cómo se registra y consulta un Grano en un directorio Orleans?
- ¿Qué sucede si un Grano no está registrado en el directorio?
Resumen de la Clase
- Orleans usa Directorios para localizar Granos en un clúster distribuido.
- Implementamos un Directorio personalizado para optimizar la búsqueda de Granos.
- Probamos la configuración registrando y localizando Granos en el sistema.
Próxima Clase: Uso Avanzado de Orleans Streams
En la siguiente clase, aprenderemos cómo mejorar el rendimiento y escalabilidad de Orleans Streams, incluyendo filtrado de eventos y procesamiento paralelo.