Przechowywanie wersji interfejsu ziarna

W tym artykule dowiesz się, jak używać obsługi wersji interfejsu ziarna. Przechowywanie wersji stanu ziarna jest poza zakresem.

Omówienie

W danym klastrze silosy mogą obsługiwać różne wersje typu ziarna.

Cluster with different versions of a grain

W tym przykładzie klient i Silo{1,2,3} zostały skompilowane przy użyciu interfejsu A ziarna w wersji 1. Silo 4 został skompilowany z wersją A 2.

Ograniczenia

  • Brak przechowywania wersji dla bezstanowego procesu roboczego
  • Interfejsy przesyłania strumieniowego nie są wersjonowane

Włączanie przechowywania wersji

Jeśli atrybut wersji nie zostanie jawnie dodany do interfejsu ziarna, ziarna mają domyślną wersję 0. Ziarno wersji można użyć atrybutu VersionAttribute w interfejsie ziarna:

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

Gdzie X jest numer wersji interfejsu ziarna, który jest zwykle monotonicznie rosnący.

Zgodność i umieszczanie wersji ziarna

Po odebraniu wywołania ze ziarna wersji w klastrze:

  • Jeśli aktywacja nie istnieje, zostanie utworzona zgodna aktywacja
  • Jeśli aktywacja istnieje:
    • Jeśli bieżący nie jest zgodny, zostanie dezaktywowany i zostanie utworzony nowy zgodny (zobacz strategię selektora wersji)
    • Jeśli bieżący element jest zgodny (zobacz zgodne ziarna), wywołanie będzie obsługiwane normalnie.

Domyślnie:

  • Wszystkie wersjonowane ziarna powinny być zgodne tylko z poprzednimi wersjami (zobacz wytyczne dotyczące zgodności z poprzednimi wersjami i zgodne ziarna). Oznacza to, że ziarno v1 może wykonywać wywołania do ziarna w wersji 2, ale ziarno w wersji 2 nie może wywołać v1.
  • Jeśli w klastrze istnieje wiele wersji, nowa aktywacja zostanie losowo umieszczona na zgodnym silosie.

To zachowanie domyślne można zmienić za pomocą polecenia GrainVersioningOptions:

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