Поделиться через


Управление версиями интерфейса

В этой статье вы узнаете, как использовать управление версиями интерфейса зерна. Управление версиями состояния Grain выходит из область.

Обзор

В данном кластере силосы могут поддерживать разные версии типа зерна.

Cluster with different versions of a grain

В этом примере клиент и Silo{1,2,3} были скомпилированы с интерфейсом 1.A Silo 4 был скомпилирован с A версией 2.

Ограничения

  • Нет управления версиями в рабочей роли без отслеживания состояния
  • Интерфейсы потоковой передачи не имеют версий

Включение управления версиями

Если атрибут версии не добавляется явным образом в интерфейс зерна, то зерна имеют версию по умолчанию 0. С помощью versionAttribute в интерфейсе зерна можно использовать версию:

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

Где X номер версии интерфейса зерна, который обычно монотонно увеличивается.

Совместимость версий и размещение

Когда вызов из набора версий поступает в кластер:

  • Если активация не существует, будет создана совместимая активация
  • Если активация существует:
    • Если текущая не совместима, она будет деактивирована и будет создана новая совместимая (см . стратегию выбора версий).
    • Если текущий совместим (см . совместимые зерна), вызов будет обрабатываться нормально.

По умолчанию:

  • Все версии зерна должны быть только обратно совместимыми (см . рекомендации по обратной совместимости и совместимые зерна). Это означает, что зерно версии 1 может вызывать зерно версии 2, но зерно версии 2 не может вызывать версию 1.
  • Если в кластере существует несколько версий, новая активация будет случайным образом помещена в совместимое хранилище.

Это поведение по умолчанию можно изменить с помощью GrainVersioningOptions:

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