Partager via


Contrôle de version de l’interface de grain

Dans cet article, vous allez apprendre à utiliser le contrôle de version de l’interface de grain. Le contrôle de version de l’état du grain est pas abordé dans cet article.

Vue d’ensemble

Sur un cluster donné, les silos peuvent prendre en charge différentes versions d’un type de grain.

Cluster with different versions of a grain

Dans cet exemple, le client et le silo{1,2,3} ont été compilés avec l’interface de grain A version 1. Le silo 4 a été compilé avec A version 2.

Limites

  • Pas de contrôle de version sur un worker sans état
  • Les interfaces de streaming ne sont pas versionnées

Activer le contrôle de version

Si l’attribut de version n’est pas explicitement ajouté à l’interface de grain, la version par défaut des grains est 0. Vous pouvez versionner un grain en utilisant VersionAttribute dans l’interface de grain :

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

X représente ici le numéro de version de l’interface de grain, qui augmente généralement de façon monotone.

Compatibilité et placement de la version du grain

Quand un appel formulé par un grain versionné arrive dans un cluster :

  • S’il n’existe pas d’activation, une activation compatible est créée
  • S’il existe une activation :
    • Si la version actuelle n’est pas compatible, elle est désactivée et une nouvelle version compatible est créée (consultez Stratégie du sélecteur de version)
    • Si la version actuelle est compatible (consultez Grains compatibles), l’appel est géré normalement.

Par défaut :

  • Tous les grains versionnés sont censés offrir une compatibilité descendante uniquement (consultez Recommandations en matière de compatibilité descendante et Grains compatibles). Cela signifie qu’un grain v1 peut effectuer des appels vers un grain v2, mais qu’un grain v2 ne peut pas appeler un grain v1.
  • Quand il existe plusieurs versions dans un cluster, la nouvelle activation est placée de manière aléatoire dans un silo compatible.

Vous pouvez modifier ce comportement par défaut via GrainVersioningOptions :

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