多群集通信

必须配置网络,以便任何 Orleans 服务器都可以通过 TCP/IP 连接到任何其他 Orleans 服务器,无论其地理位置如何。 具体如何实现这一点超出了Orleans的范围,因为这取决于孤岛的部署方式和地点。

例如,在 Azure 上,可以使用 VNet 连接区域中的多个部署和网关,以跨不同区域连接 VNet。

群集标识符

每个群集都有自己的唯一群集 ID。 必须在全局配置中指定群集 ID。

群集 ID 不能为空,也不能包含逗号。 此外,如果使用 Azure 表存储,群集 ID 不能包含行键(/、、#、?)禁止使用的字符。

我们建议对群集 ID 使用非常短的字符串,因为它们频繁传输,并且可能由某些日志视图提供程序存储在存储中。

群集网关

每个群集会自动指定一部分活动的孤岛来担当 群集网关。 群集网关直接将其 IP 地址播发到其他群集,因此可以充当“第一次接触点”。 默认情况下,Orleans 将最多 10 个筒仓(或者配置为 MaxMultiClusterGateways 的数量)指定为集群网关。

不同群集中的孤岛之间的通信 并不总是 通过网关。 一旦筒仓了解到并缓存粒度激活的位置(不论群集如何),它就会将消息直接发送到该筒仓,即使目标筒仓不是群集网关也是如此。

八卦

Gossip 是群集共享配置和状态信息的机制。 顾名思义,八卦是分散的和双向的:每个孤岛直接与其他孤岛(在同一群集和其他群集中)进行通信,以双向交换信息。

内容:八卦包含下列信息中的某些或全部:

  • 当前时间戳 的多群集配置
  • 包含群集网关相关信息的字典。 键是桶地址,值包含:(1) 时间戳;(2) 群集 ID;(3) 状态(活动或非活动)。

快速和慢速传播:当网关更改其状态或作员注入新配置时,此八卦信息将立即发送到所有孤岛、群集和八卦通道。 这种情况很快发生,但并不可靠。 如果消息因任何原因而丢失(例如,竞争条件、中断的套接字、存储筒仓故障),那么定期后台传播机制可以确保信息最终会传播开来,尽管速度更慢。 所有信息最终在任何地方传播,并且对偶尔的消息丢失和失败具有高度复原能力。

所有八卦数据都带有时间戳。 这可确保较新的信息替换较旧的信息,而不考虑消息的相对时间。 例如,较新的多群集配置将替换较旧的群集配置,有关网关的更新信息将替换有关该网关的较旧信息。 有关八卦数据的表示形式的详细信息,请参阅该 MultiClusterData 类。 它具有一个 Merge 方法,该方法结合传闻数据,并使用时间戳解决冲突。

八卦频道

当孤岛首次启动时,或在发生故障后重新启动时,它需要一种方法来 启动消息传递。 这是传言通道的功能,你可以在Silo配置中设置。 启动时,silo 从通信通道中获取所有信息。 启动后,silo 每 30 秒(或配置的BackgroundGossipInterval间隔)进行状态更新。 每次,它都会将其八卦信息与从所有群集网关和八卦通道随机选择的合作伙伴同步。

  • 虽然并非严格要求,但我们建议始终在不同的区域中至少配置两个八卦通道,以提高可用性。
  • 与八卦通道通信的延迟并不重要。
  • ServiceIdGuid 在各自的配置中指定不同,多项服务可以使用相同的传播通道,而不会造成干扰。
  • 只要通道足以让孤岛在启动时最初与“八卦社区”连接,就不需要严格要求所有孤岛都使用相同的八卦通道。 但是,如果八卦通道不属于一个仓的配置,并且该仓是一个网关,它就不会将其状态更新推送到该通道(快速传播)。 因此,这些更新可能需要更长的时间才能通过定期后台传播(慢传播)到达渠道。

基于 Azure 表的八卦通道

我们实现了基于 Azure 表的消息频道。 配置指定用于 Azure 帐户的标准连接字符串。 例如,配置可以指定两个八卦通道,每个通道都配有单独的 Azure 存储帐户 usaeurope,如下所示:

var silo = new HostBuilder()
    .UseOrleans(builder =>
    {
        builder.Configure<MultiClusterOptions>(options =>
        {
            options.GossipChannels.Add(
                "AzureTable",
                "DefaultEndpointsProtocol=https;AccountName=usa;AccountKey=...");
            options.GossipChannels.Add(
                "AzureTable",
                "DefaultEndpointsProtocol=https;AccountName=europe;AccountKey=...")
        });
    })

多个不同的服务可以使用相同的八卦通道而不会相互干扰,只要它们各自的配置中指定的ServiceIdGuid是不同的即可。