Grain 协调特性

开发人员可以指示群集何时以及如何协调其有关特定 grain 类的 grain 目录。 GlobalSingleInstanceAttribute 意味着,我们需要与在单个全局群集中运行 Orleans 时相同的行为:也就是将所有调用路由到单个激活的 grain。 相反,[OneInstancePerCluster] 特性指示每个群集可以具有其独立激活。 这在不需要群集之间的通信时是适用的。

特性放置在 grain 实现上。 例如:

using Orleans.MultiCluster;

[GlobalSingleInstance]
public class MyGlobalGrain : Orleans.Grain, IMyGrain
{
   // ...
}

[OneInstancePerCluster]
public class MyLocalGrain : Orleans.Grain, IMyGrain
{
   // ...
}

如果 grain 类未指定其中任一特性,则它默认为 OneInstancePerClusterAttribute,或在配置参数 GlobalConfiguration.UseGlobalSingleInstanceByDefault 设置为 true 时默认为 GlobalSingleInstanceAttribute

全局单实例 grain 的协议

访问全局单实例 (GSI) grain 并且不知道是否存在激活时,会在激活新实例之前执行特殊的 GSI 激活协议。 具体来说,会向当前多群集配置中的所有其他群集发送一个请求,以检查它们是否已经有该 grain 的激活。 如果所有响应都是否定的,则会在此群集中创建一个新的激活。 否则,将使用远程激活(并且会将对它的引用缓存在本地目录中)。

“每群集一个实例”grain 的协议

对于“每群集一个实例”grain,没有群集间通信。 它们只是在每个群集中独立使用标准 Orleans 机制。 在 Orleans 框架本身中,以下 grain 类将标有 OneInstancePerClusterAttribute

  • ManagementGrain
  • SystemTargetBasedMembershipTable
  • GrainBasedReminderTable

可疑激活

如果 GSI 协议在 3 次(或由配置参数 GlobalSingleInstanceNumberRetries 指定的任何数量)重试后没有收到来自所有群集的决定性响应,它会乐观地创建一个新的本地“可疑”激活,从而优先实现可用性(与实现一致性相比)。

可疑激活可能是重复项(因为在 GSI 协议激活期间没有响应的一些远程群集可能仍然有此 grain 的激活)。 因此,定期每隔 30 秒(或由配置参数 GlobalSingleInstanceRetryInterval 指定的任何时间间隔),GSI 协议将针对所有可疑激活再次运行。 这可确保在还原群集之间的通信后,可以检测到并删除重复激活。