Orleans 2.0 官方文档 —— 6.8.3 部署 -> 多集群支持 -> gossip 通道

多群集通信

必须以这样的方式配置网络:任何Orleans silo都可以通过TCP/IP连接到任何其他的Orleans silo,无论它位于何处。究竟如何实现这一目标,并不在Orleans的范围之内,因为它取决于如何部署silo、以及在何处部署silo。

例如,在Windows Azure上,我们可以使用VNETs,来连接到区域内的多个部署,以及跨不同区域连接VNETs的网关。

集群ID

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

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

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

集群网关

每个集群自动指定其活动silo的一个子集作为集群网关。集群网关直接将其IP地址,通告给其他集群,因此可以充当“第一次联系人”。默认情况下,最多将10个silo(或配置为MaxMultiClusterGateways的任何数量)指定为集群网关。

不同集群中的silo之间的通信并不总是通过网关。一旦silo了解并缓存了grain激活体的位置(无论在哪个集群中),它都会直接向该silo发送消息,即使该silo不是集群网关。

gossip

Gossip是一种用于群集共享配置和状态信息的机制。顾名思义,gossip是去中心化的和双向的:每个silo直接地与其他silo(同一集群中或其他群集中的)通信,以双向地交换信息。

内容:gossip包含以下部分或全部信息:

  • 带当前时间戳的多群集配置。
  • 包含了有关集群网关信息的一个字典。密钥是silo的地址,值包含:(1)一个时间戳,(2)一个集群ID,以及(3)一个状态,即活动或非活动状态。

快速和慢速传播。当一个网关改变其状态时,或者当作业人员注入一个新的配置时,这个gossip信息会立即发送到所有的silo、集群和gossip通道。这种情况发生得很快,但并不可靠。如果消息由于任何原因而丢失(例如,争用、断开的套接字、silo故障),我们的周期性的、后台的gossip,确保信息最终传播,尽管速度较慢。所有信息最终都会传播到任何地方,并且对偶尔的消息丢失和故障,具有高度的弹性。

所有的gossip数据都带有时间戳,这可以确保新的信息替换旧的信息,而不管消息的相对时间如何。例如,较新的多集群配置会替换较旧的集群,而较新的网关信息会替换较旧的网关信息。有关gossip数据表示的更多详细信息,请参阅该MultiClusterData类。它有一个Merge方法,该方法组合了gossip数据,使用时间戳解决冲突。

gossip通道

当一个silo首次启动时,或者在发生故障后重新启动时,它需要有一种方法来引导gossip。这就是gossip通道的职能,它可以在筒仓配置中进行配置。在启动时,一个silo从gossip通道中获取所有信息。启动之后,一个silo会每隔30秒(或配置为BackgroundGossipInterval的值),定期进行gossip。每次它都会将其gossip信息,与从所有集群网关和gossip通道中随机选择的伙伴同步。

注:

  • 虽然不是严格要求,但我们建议,在不同的区域中,始终配置至少两个gossip频道,以提高可用性。

  • 与gossip 通道通信的延迟并不重要。

  • 多个不同的服务,只要ServiceId Guid(由它们各自的配置指定)是不同的,它们就可以使用相同的gossip通道,而不会产生干扰。

  • 并不严格要求所有的silo使用相同的gossip通道,只要通道足够让silo在启动时与“gossip社区”能初始地连接。但是,如果gossip通道不是silo配置的一部分,并且该silo是网关,则它不会将其状态更新推送到通道(快速传播),因此可能需要更长的时间,才能通过周期性的、后台的gossip到达频道(慢传播)。

基于Azure表的通道

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

var silo = new SiloHostBuilder()
  [...]
  .Configure(options => 
  {
    [...]
    options.GossipChannels.Add("AzureTable", "DefaultEndpointsProtocol=https;AccountName=usa;AccountKey=...");
    options.GossipChannels.Add("AzureTable", "DefaultEndpointsProtocol=https;AccountName=europe;AccountKey=...")
    [...]
  })
  [...]

多个不同的服务,可以使用相同的八卦频道而不受干扰,只要它们各自配置指定的ServiceId guid是不同的。

其他的gossip通道的实现

我们正在开发其他的gossip通道提供程序,类似于为许多不同的存储后端封装成员身份和提醒器的方式。

你可能感兴趣的:(Orleans)