异构的筒仓
概览
在给定的集群上,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类型。
在支持它的每个silo上,给定的Grain Type的实现必须相同。以下方案是无效的:
在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上,部署不同的二进制文件。然而,如果必要的话,你可以用TypeManagementOptions
中的TypeMapRefreshInterval
属性,来更改silo和客户端检查支持的类型发生变化的时间间隔。
出于测试目的,你可以使用GrainClassOptions
中的ExcludedGrainTypes
属性,它是您要在silo中排除的类型的列表名称。
限制
- 如果支持的grain类型集合发生变化,则不会通知已连接的客户。在前面的示例中:
- 如果Silo 4离开集群,客户端仍将尝试调用类型
E
的grain。它会在运行时失败,并抛出一个OrleansException。 - 如果客户端在Silo 4加入之前连接到集群,则客户端将无法调用类型
E
的grain。它会失败,并抛出一个ArgumentException。
- 如果Silo 4离开集群,客户端仍将尝试调用类型
- 不支持无状态grain:集群中的所有silo,必须支持同一组无状态grain。