En esta clase aprenderemos cómo actualizar Granos en producción sin afectar la ejecución del sistema, asegurando compatibilidad entre versiones y migrando datos sin interrupciones.
Objetivos de la Clase
- Comprender cómo actualizar Granos Orleans sin afectar su ejecución.
- Implementar versionado de Granos para garantizar compatibilidad con clientes antiguos.
- Aplicar estrategias de migración de datos al actualizar Granos.
- Configurar Orleans para permitir migraciones seguras entre versiones de Granos.
¿Por qué es Importante el Versionado en Orleans?
En entornos Orleans de producción, los Granos pueden mantener estado y ejecutarse en múltiples nodos.
Si una actualización interrumpe su ejecución o invalida su estado, puede causar pérdida de datos o fallos en la aplicación.
Retos al Actualizar Granos Orleans
- Mantener compatibilidad con versiones anteriores para clientes que aún no migraron.
- Migrar datos sin afectar el estado actual de los Granos.
- Realizar despliegues progresivos sin necesidad de reiniciar todo el sistema.
Métodos para Actualizar Granos en Orleans
Versionado de Interfaces y Clases
Si se necesita agregar métodos o cambiar estructuras de datos, se recomienda mantener las versiones antiguas hasta que todos los clientes migren.
Paso 1: Crear una Nueva Versión del Grano
public interface IUsuarioGrainV1 : IGrainWithStringKey
{
Task<string> ObtenerNombre();
}
public interface IUsuarioGrainV2 : IGrainWithStringKey
{
Task<string> ObtenerNombre();
Task EstablecerEdad(int edad);
}
Paso 2: Mantener Compatibilidad en la Implementación
public class UsuarioGrainV2 : Grain, IUsuarioGrainV1, IUsuarioGrainV2
{
private string _nombre = "Desconocido";
private int _edad = 0;
public Task<string> ObtenerNombre() => Task.FromResult(_nombre);
public Task EstablecerEdad(int edad)
{
_edad = edad;
return Task.CompletedTask;
}
}
Los clientes que usan IUsuarioGrainV1
seguirán funcionando, y los nuevos clientes pueden usar IUsuarioGrainV2
.
Migración de Datos sin Pérdida de Estado
Si se necesita modificar la estructura de los datos almacenados, Orleans permite migrarlos automáticamente.
Paso 1: Actualizar el Modelo de Datos
Antes:
public class UsuarioState
{
public string Nombre { get; set; }
}
Después:
[GenerateSerializer]
public class UsuarioState
{
[Id(0)] public string Nombre { get; set; }
[Id(1)] public int Edad { get; set; } = 18; // Nuevo campo con valor predeterminado
}
Orleans migrará los datos automáticamente sin perder el estado existente.
3️⃣ Despliegue sin Interrupciones en Kubernetes
Si Orleans se ejecuta en Kubernetes o Azure, se recomienda usar despliegues progresivos para actualizar los Granos sin detener la aplicación.
Paso 1: Crear un Nuevo Despliegue en Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: orleans-v2
spec:
replicas: 3
selector:
matchLabels:
app: orleans
template:
metadata:
labels:
app: orleans
spec:
containers:
- name: orleans
image: orleans-demo:v2
Ejecuta en la terminal:
kubectl apply -f orleans-deployment.yaml
Este despliegue creará nuevas instancias de Orleans sin detener las versiones anteriores.
Probar la Actualización en Orleans
1. Ejecutar el Silo Orleans
dotnet run
2. Llamar a un Grano con la Nueva Versión
Edita Program.cs
en OrleansClient y prueba:
var cliente = new ClientBuilder()
.UseLocalhostClustering()
.Build();
await cliente.Connect();
var usuarioV2 = cliente.GetGrain<IUsuarioGrainV2>("usuario123");
await usuarioV2.EstablecerEdad(25);
Console.WriteLine($"Nombre: {await usuarioV2.ObtenerNombre()}");
Los datos antiguos seguirán disponibles y la nueva funcionalidad funcionará sin problemas.
Cuestionario de Autoevaluación
- ¿Por qué es importante mantener compatibilidad entre versiones de Granos Orleans?
- ¿Cómo Orleans maneja la migración de datos sin perder el estado de los Granos?
- ¿Qué técnica permite actualizar un Grano sin afectar clientes antiguos?
- ¿Cómo se puede desplegar Orleans en Kubernetes sin interrupciones?
- ¿Cuál es la diferencia entre versionado de Granos y migración de datos?
Resumen de la Clase
- Actualizar Granos Orleans sin interrupciones es clave para sistemas en producción.
- El versionado de interfaces permite agregar nuevas funciones sin afectar clientes antiguos.
- Orleans maneja la migración de datos automáticamente, asegurando que los estados previos se mantengan.
- Los despliegues en Kubernetes permiten actualizar Orleans progresivamente sin detener el sistema.
Próxima Clase: Unit Testing
En la siguiente clase, aprenderemos cómo integrar Orleans con ASP.NET Core en un entorno de producción, optimizando rendimiento y seguridad.