Control de versiones de interfaz de grano

En este artículo, aprenderá a usar el control de versiones de interfaz de grano. El control de versiones del estado de grano está fuera del ámbito.

Información general

En un clúster determinado, los silos pueden admitir diferentes versiones de un tipo de grano.

Cluster with different versions of a grain

En este ejemplo, el cliente y silo{1,2,3} se compilaron con la versión 1 A de la interfaz de grano. Silo 4 se compiló con la versión 2 A.

Limitaciones

  • Sin control de versiones en el trabajo sin estado
  • Las interfaces de streaming no tienen versiones

Permitir control de versiones

Si el atributo de versión no se agrega explícitamente a la interfaz de grano, los granos tienen una versión predeterminada de 0. Puede usar VersionAttribute en la interfaz de grano para controlar la versión del grano:

[Version(X)]
public interface IVersionUpgradeTestGrain : IGrainWithIntegerKey
{
}

Donde X es el número de versión de la interfaz de grano, que suele aumentar de forma monotónica.

Compatibilidad y colocación de versiones de grano

Cuando llega una llamada desde un grano con versiones en un clúster:

  • Si no existe ninguna activación, se creará una activación compatible
  • Si existe una activación:

De manera predeterminada:

  • Se supone que todos los granos con versiones son compatibles con versiones anteriores (consulte las directrices de compatibilidad con versiones anteriores y los granos compatibles). Esto significa que un grano v1 puede realizar llamadas a un grano v2, pero un grano v2 no puede llamar a una versión 1.
  • Cuando existen varias versiones en el clúster, la nueva activación se colocará aleatoriamente en un silo compatible.

Puede cambiar este comportamiento predeterminado con GrainVersioningOptions:

var silo = new HostBuilder()
    .UseOrleans(c =>
    {
        c.Configure<GrainVersioningOptions>(options =>
        {
            options.DefaultCompatibilityStrategy = nameof(BackwardCompatible);
            options.DefaultVersionSelectorStrategy = nameof(MinimumVersion);
        });
    });