title: 异构Silos

总览

在一个给定的集群上,Silo可以支持一组不同的Grain类型。 title: 异构Silos - 图1

在这个例子中,集群支持ABCDE类型的Grain。

  • Grain类型AB可以放在1号和2号Silo上。
  • Grain类型C可以放在1、2、3号Silo上。
  • Grain类型D只能放置在3号Silo上
  • Grain类型E只能放置在4号Silo上。

所有Silo都应该引用集群中所有Grain类型的接口,但Grain类只应被承载它们的Silo所引用。

客户端不知道哪个Silo可以支持某个特定的Grain类型。

一个给定的Grain类型的实现在支持它的每个Silo上都必须是相同的。以下情况是无效的:

在1号和2号Silo上:

  1. public class C: Grain, IMyGrainInterface
  2. {
  3. public Task SomeMethod() { }
  4. }

在3号Silo上:

  1. public class C: Grain, IMyGrainInterface, IMyOtherGrainInterface
  2. {
  3. public Task SomeMethod() { }
  4. public Task SomeOtherMethod() { }
  5. }

配置

无需配置,你可以在集群的每个Silo上部署不同的二进制文件。 然而,如果有必要,你可以改变Silo和客户端检查类型变化的时间间隔,通过特性TypeMapRefreshInterval,它来自TypeManagementOptions

为了测试,你可以使用GrainClassOptions中的特性ExcludedGrainTypes,这是一个你想在Silo上排除的类型的名称列表。

限制条件

  • 如果支持的Grain类型集合发生变化,连接的客户端并不会被通知。在前面的例子中:
    • 如果4号Silo离开集群,客户端仍将尝试对E类型的Grain进行调用。它会使运行时抛出OrleansException而故障。
    • 如果客户端在4号Silo加入集群之前已经连接到集群,客户端将不能调用E类型的晶粒。它将以ArgumentException故障。
  • 不支持无状态Grain:集群中的所有Silo必须支持同一组无状态Grain。
  • 不支持ImplicitStreamSubscription,因此只有“显式订阅”可以在Orleans流中使用。