Grain 接口版本控制

本文介绍如何使用 grain 接口版本控制。 Grain 状态的版本控制不在讨论范围之内。

概述

在给定的群集上,silo 可以支持不同版本的 grain 类型。

Cluster with different versions of a grain

在此示例中,客户端和 Silo{1,2,3} 是使用 grain 接口 A 版本 1 编译的。 Silo 4 是使用 A 版本 2 编译的。

限制

  • 无状态辅助角色上没有任何版本控制
  • 流接口不进行版本控制

启用版本控制

如果未将版本特性显式添加到 grain 接口,则 grain 的默认版本为 0。 可以在 grain 接口上使用 VersionAttribute 对 grain 进行版本控制:

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

其中 X 是 grain 接口的版本号,通常是单调递增的。

Grain 版本兼容性和放置

当来自受版本控制的 grain 的调用到达群集时:

  • 如果不存在激活,将创建兼容的激活
  • 如果存在激活:
    • 如果当前版本不兼容,则会将其停用并创建新的兼容版本(请参阅版本选择器策略
    • 如果当前版本是兼容的(请参阅兼容的 grain),则将正常处理该调用。

默认情况下:

  • 所有受版本控制的 grain 都只应后向兼容(请参阅后向兼容性指南兼容的 grain)。 这意味着 v1 grain 可以调用 v2 grain,但 v2 grain 无法调用 v1。
  • 群集中存在多个版本时,新激活将随机放置在兼容的 silo 上。

可以通过 GrainVersioningOptions 更改此默认行为:

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