异类信息孤岛概述

在给定的群集上,筒仓可以支持不同的谷物类型集。

异类数据孤岛概览图。

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

  • 粮食类型 AB 可以放置在筒仓 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错误。
  • 异构部署不支持无状态粒:集群中的所有孤粒必须支持同一组无状态粒。
  • ImplicitStreamSubscriptionAttribute不被支持;因此,在具有异构孤岛的Orleans流中只能使用显式订阅