异类 silo 概述
在给定的群集上,silo 可以支持一组不同的 grain 类型:
在此示例中,群集支持 A
、B
、C
、D
、E
类型的 grain:
- Grain 类型
A
和B
可放置在 Silo 1 和 2 上。 - Grain 类型
C
可放置在 Silo 1、2 或 3 上。 - Grain 类型
D
只能放置在 Silo 3 上 - Grain 类型
E
只能放置在 Silo 4 上。
所有 silo 都应可以引用群集所有 grain 类型的接口,但 grain 类只应由承载它们的 silo 引用。 客户端不知道哪个 silo 支持给定的 Grain 类型。
重要
给定 grain 类型实现必须在每个支持它的 silo 上都相同。
以下方案无效:
在 Silo 1 和 2 上:
public class C: Grain, IMyGrainInterface
{
public Task SomeMethod() { /* ... */ }
}
在 Silo 3 上:
public class C: Grain, IMyGrainInterface, IMyOtherGrainInterface
{
public Task SomeMethod() { /* ... */ }
public Task SomeOtherMethod() { /* ... */ }
}
配置
无需进行任何配置,便可以在群集中的每个 silo 上部署不同的二进制文件。 但是,如有必要,你可以更改 silo 和客户端用于检查 TypeManagementOptions.TypeMapRefreshInterval 属性所支持类型更改的间隔。
出于测试目的,可以使用 GrainClassOptions.ExcludedGrainTypes 属性,该属性是要在 silo 上排除的类型的名称列表。
限制
- 如果支持的 Grain 类型集已更改,不会通知连接的客户端。 在前面的示例中:
- 如果 Silo 4 离开群集,客户端仍将尝试调用类型
E
的 grain。 它将在运行时失败,并出现 OrleansException。 - 如果在 Silo 4 加入群集之前客户端已连接到群集,则客户端将无法调用类型
E
的grain。 它将失败,并出现 ArgumentException。
- 如果 Silo 4 离开群集,客户端仍将尝试调用类型
- 无状态 grain 不受支持:群集中的所有 silo 都必须支持同一组无状态 grain。
- ImplicitStreamSubscriptionAttribute 不受支持,因此只有显式订阅才能在 Orleans 流中使用。