Controllo delle versioni dell'interfaccia grana

In questo articolo si apprenderà come usare il controllo delle versioni dell'interfaccia grana. Il controllo delle versioni dello stato grana non rientra nell'ambito.

Panoramica

In un determinato cluster i silo possono supportare versioni diverse di un tipo di grana.

Cluster with different versions of a grain

In questo esempio, il client e silo{1,2,3} sono stati compilati con l'interfaccia granulare A versione 1. Il silo 4 è stato compilato con A versione 2.

Limiti

  • Nessun controllo delle versioni nel ruolo di lavoro senza stato
  • Le interfacce di streaming non sono soggette a controllo delle versioni

Abilitare il controllo delle versioni

Se l'attributo versione non viene aggiunto in modo esplicito all'interfaccia granulare, i grani presentano una versione predefinita di 0. È possibile specificare la grana della versione usando VersionAttribute nell'interfaccia granulare:

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

Dove X è il numero di versione dell'interfaccia granulare, che in genere aumenta in modo monotonico.

Compatibilità e posizionamento delle versioni della grana

Quando in un cluster arriva una chiamata da una grana con controllo delle versioni:

  • Se non esiste alcuna attivazione, ne verrà creata una compatibile
  • Se esiste un'attivazione:
    • Se quella attuale non è compatibile, verrà disattivata e sarà creata una nuova compatibile (vedere strategiadel selettore di versione)
    • Se quella attuale è compatibile (vedere granicompatibili), la chiamata verrà gestita normalmente.

Per impostazione predefinita:

  • Tutti i grani con versione devono essere compatibili solo con le versioni precedenti (vedere linee guida per la compatibilità con le versioni e granicompatibili). Questo significa che una grana v1 può effettuare chiamate a una grana v2, ma una grana v2 non può chiamare una v1.
  • Quando nel cluster esistono più versioni, la nuova attivazione sarà posizionata in modo casuale su un silo compatibile.

È possibile modificare questo comportamento predefinito tramite GrainVersioningOptions:

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