0

Microsoft Orleans #16: Actualización de Granos en Producción (Versioning)

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

  1. ¿Por qué es importante mantener compatibilidad entre versiones de Granos Orleans?
  2. ¿Cómo Orleans maneja la migración de datos sin perder el estado de los Granos?
  3. ¿Qué técnica permite actualizar un Grano sin afectar clientes antiguos?
  4. ¿Cómo se puede desplegar Orleans en Kubernetes sin interrupciones?
  5. ¿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.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *