在给定的群集上,筒仓可以支持不同的谷物类型集。
在此示例中,群集支持类型A
、B
、C
、D
和E
。
- 粮食类型
A
和B
可以放置在筒仓 1 和 2 上。 - 粮食类型
C
可以放置在筒仓 1、2 或 3 上。 - 谷物类型
D
只能放置在筒仓 3 上。 - 谷物类型
E
只能放置在筒仓4上。
所有筒仓应引用集群中所有粮食类型的接口,但粮食类仅应被容纳它们的筒仓引用。 客户端不知道哪个筒仓支持给定的粮食种类。
重要
给定的谷物类型实现必须在每个支持它的桶仓上保持一致。
以下方案无效:
关于筒仓 1 和 2:
public class C: Grain, IMyGrainInterface
{
public Task SomeMethod() { /* ... */ }
}
在筒仓 3 上:
public class C: Grain, IMyGrainInterface, IMyOtherGrainInterface
{
public Task SomeMethod() { /* ... */ }
public Task SomeOtherMethod() { /* ... */ }
}
配置
无需配置;可以在群集中的每个孤岛上部署不同的二进制文件。 但是,如有必要,您可以更改存储库和客户端使用 TypeManagementOptions.TypeMapRefreshInterval 属性检查受支持类型更改的间隔。
出于测试目的,可以使用 GrainClassOptions.ExcludedGrainTypes 属性,该属性是一个包含您想要在特定系统上排除的类型名称的列表。
局限性
- 如果支持的粒度类型集发生更改,则不会通知连接的客户端。 在前面的示例中:
- 如果Silo 4离开群集,客户端仍会尝试调用
E
类型的grains。 它在运行时失败,并出现 OrleansException. - 如果客户端在仓库 4 加入之前连接到群集,则客户端无法调用类型
E
的 grains。 它失败并出现ArgumentException错误。
- 如果Silo 4离开群集,客户端仍会尝试调用
- 异构部署不支持无状态粒:集群中的所有孤粒必须支持同一组无状态粒。
- ImplicitStreamSubscriptionAttribute不被支持;因此,在具有异构孤岛的Orleans流中只能使用显式订阅。