异类 silo 概述

在给定的群集上,silo 可以支持一组不同的 grain 类型:

Heterogeneous silos overview diagram.

在此示例中,群集支持 ABCDE 类型的 grain:

  • Grain 类型 AB 可放置在 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
  • 无状态 grain 不受支持:群集中的所有 silo 都必须支持同一组无状态 grain。
  • ImplicitStreamSubscriptionAttribute 不受支持,因此只有显式订阅才能在 Orleans 流中使用。