grain版本管理
警告
本页介绍如何使用grain接口版本管理。Grain状态的版本管理不在此范围。
概览
在给定的集群上,silo可以支持不同版本的grain类型。
在此示例中,客户端和silo {1,2,3}使用grain接口A
的版本1进行编译,silo 4使用A
的版本2 进行编译。
限制:
- 无状态工作者无版本控制
- 流(Streaming)接口无版本控制
启用版本控制
默认情况下,grain没有版本控制。您可以使用grain接口上的VersionAttribute,来对grain进行版本控制:
[Version(X)]
public interface IVersionUpgradeTestGrain : IGrainWithIntegerKey {}
其中X
是grain 接口的版本号,通常是单调递增的。
Grain版本兼容性和位置
当一个调用(此调用来自一个版本管理的grain)到达集群时:
- 如果不存在激活体,则将创建兼容的激活体
- 如果存在激活体:
- 如果当前不兼容,它将被停用并将创建新的兼容(请参阅版本选择器策略)
- 如果当前兼容(请参阅兼容的谷物),调用将正常处理。
默认情况下:
- 所有版本化的grain都应该是只向后兼容(参见向后兼容性指南)和可兼容的grain(Compatible-grains.md))。这意味着v1的grain可以调用v2的grain,但v2的grain不能调用v1。
- 当集群中存在多个版本时,新激活体将随机放置在兼容的silo上。
您可以通过以下GrainVersioningOptions
选项,更改此默认行为:
var silo = new SiloHostBuilder()
[...]
.Configure<GrainVersioningOptions>(options =>
{
options.DefaultCompatibilityStrategy = nameof(BackwardCompatible);
options.DefaultVersionSelectorStrategy = nameof(MinimumVersion);
})
[...]