可以指示群集何时以及如何协调特定粒度类的粒度目录。 这意味着 GlobalSingleInstanceAttribute 你想要与在单个全局群集中运行时 Orleans 相同的行为:将所有调用路由到单个粒度激活。 相反,该 [OneInstancePerCluster]
属性指示每个群集可以具有其独立激活。 如果不想在群集之间通信,则这是合适的。
将属性附加到微粒实现上。 例如:
using Orleans.MultiCluster;
[GlobalSingleInstance]
public class MyGlobalGrain : Orleans.Grain, IMyGrain
{
// ...
}
[OneInstancePerCluster]
public class MyLocalGrain : Orleans.Grain, IMyGrain
{
// ...
}
如果粒度类未指定其中任一属性,则默认为 OneInstancePerClusterAttribute。 如果将配置参数GlobalConfiguration.UseGlobalSingleInstanceByDefault设置为true
,则默认为GlobalSingleInstanceAttribute。
全局单实例粒度协议
当访问一个全局单实例(GSI)粒度时,如果不知道是否存在激活,Orleans 会在激活新实例之前执行一个特殊的 GSI 激活协议。 具体而言,它会向当前 多群集配置 中的所有其他群集发送请求,以检查它们是否已为此粒度激活。 如果所有响应都是负的,Orleans 会在当前群集中创建新的激活。 否则,它会使用远程激活(并在本地目录中缓存对它的引用)。
每个集群一个实例粒子的协议
对于每个群集的一个实例粒度,群集间没有通信。 它们只是在每个群集中单独使用标准 Orleans 机制。 在框架本身中,以下粒类被标记为 OneInstancePerClusterAttribute:
ManagementGrain
SystemTargetBasedMembershipTable
GrainBasedReminderTable
可疑激活
如果 GSI 协议在 3 次重试后未收到来自所有群集的决定性响应(或配置参数指定的 GlobalSingleInstanceNumberRetries 数字),则乐观地创建一个新的本地“可疑”激活,有利于可用性与一致性。
“可疑”表示激活可能是重复的,因为 GSI 协议期间未响应的远程群集可能仍具有此粒度的激活。 因此,定期每隔 30 秒(或配置参数指定的 GlobalSingleInstanceRetryInterval 间隔) Orleans 再次运行 GSI 协议,以执行所有可疑激活。 此过程可确保在还原群集之间的通信后,系统可以检测和删除重复激活。