Orleans 2.0 官方文档 —— 6.8.5 部署 -> 多集群支持 -> Global-Single-Instance

grain协作的属性

开发人员可以指示集群,何时以及如何针对特定的grain类,协调它们的grain目录。[GlobalSingleInstance]属性意味着,我们需要与在单个的全局集群中运行Orleans时相同的行为:即,将所有调用路由到单个激活的grain。相反,该[OneInstancePerCluster]属性指示每个集群可以具有其自己的独立激活。如果不想要集群之间进行通信,这是合适的做法。

属性放在grain的实现上。例如:

using Orleans.MultiCluster;

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

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

如果grain类没有指定属性的二者之一,则默认为[OneInstancePerCluster],或者配置参数UseGlobalSingleInstanceByDefault被设置为true时,为[GlobalSingleInstance]

关于Global-Single-Instance grain的协议

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

关于One-Instance-Per-Cluster grain的协议

对于One-Instance-Cluster grain,不存在集群之间的通信。他们只是在每个集群中,独立地使用标准的Orleans机制。在Orleans框架内部,下面grain类都标有[OneInstancePerCluster]属性:ManagementGrainGrainBasedMembershipTable,和GrainBasedReminderTable

令人怀疑的激活

如果GSI协议在3次重试后(或配置参数GlobalSingleInstanceNumberRetries指定的任何值)未收到来自所有集群的确定响应,则它会乐观地创建一个新的本地“可疑”激活,这偏向可用性而不是一致性。

“可疑”的激活可能是重复的(因为在GSI协议激活期间没有响应的某些远程集群,可能仍然激活了这个grain)。因此,针对所有的可疑激活,GSI协议会每隔30秒(或配置参数GlobalSingleInstanceRetryInterval指定的任意间隔)周期性再次运行,这样可以确保一旦集群之间的通信恢复,就可以检测到重复的激活体,并将其移除。

你可能感兴趣的:(Orleans)