ShardRegion actor 在群集中的每个节点或标记有特定角色的节点组上启动。应用两个特定应用程序的函数创立 ShardRegion,以从传入音讯中提取实体标识符和分片标识符。分片是一起治理的一组实体。对于特定分片中的第一条音讯,ShardRegion 向地方协调器 ShardCoordinator 申请分片的地位。
ShardCoordinator 决定哪个 ShardRegion 领有该 Shard,并告诉该 ShardRegion。该 region 将确认此申请并创立 Shard 监管者作为子 actor。而后,在 Shard actor 须要时将创立各个实体。因而,传入音讯通过 ShardRegion 和 Shard 达到指标实体。
如果分片宿主是另一个 ShardRegion 实例,则将音讯转发到该 ShardRegion 实例。在解析分片的地位时,对该分片的传入音讯进行缓冲,而后在晓得分片宿主时进行传递。后续到已解析分片的音讯能够立刻传递到指标目的地,而无需波及 ShardCoordinator。
场景
一旦晓得了分片的地位,ShardRegions 就会间接发送音讯。如下达到此状态的场景。在场景中,应用以下表示法:
- SC- 分片协调员
- M#- 音讯 1、2、3 等
- SR#-ShardRegion 1、2 3 等
- S#- 分片 1 2 3 等
- E#- 实体 1 2 3,等等。实体是指由集群分片治理的 Actor。
#
是一个数字,用于辨别实例,因为集群中有多个实例。
场景 1:发送音讯到本地 ShardRegion 的未知分片
1. 传入音讯 M1 到 ShardRegion 实例 SR1。
2.M1 映射到分片 S1。SR1 不晓得 S1,因而向 SC 询问 S1 的地位。
3.SC 答复 S1 的来自 SR1。
4.SR1 创立子 actor 代表分片 S1,并将音讯转发给它。
5.S1 为 E1 创立子 actor,并将音讯转发给它。
6.SR1 能够解决所有达到 SR1 的传入 S1 的音讯,而无需 SC。
场景 2:音讯发送到近程 ShardRegion 的未知分片
1. 音讯 M2 传入 ShardRegion 实例 SR1。
2.M2 映射到 S2。SR1 不理解 S2,因而向 SC 询问 S2 的地位。
3.SC 答复 S2 的来自 SR2。
4.SR1 向 S2 发送为 SR2 的缓冲音讯。
5.SR1 能够在没有 SC 的状况下,解决达到 SR1 的传入 S2 的所有音讯。它将音讯转发到 SR2。
6.SR2 收到无关 S2 的音讯,询问 SC,它答复 S2 的来自 SR2,如场景 1 形容的。
分片地位
为了确保特定实体 actor 的最多一个实例在集群中的某处运行,重要的是所有节点对分片的地位具备雷同的认识。因而,分片调配决定由地方 ShardCoordinator 决定,地方 ShardCoordinator 作为集群单例运行,即所有集群节点中或标记有特定角色的一组节点中的最老的一个实例。
在可插拔 shard allocation strategy 中定义了决定分片位于何处的逻辑。
分片再均衡
为了可能应用集群中新增加的成员,协调器利用分片的从新均衡,行将实体从一个节点迁徙到另一个节点。在从新均衡过程中,协调器首先告诉所有 ShardRegion actors,已开始为分片进行切换。这意味着它们将开始缓冲该分片的传入音讯,就像分片地位未知一样。在从新均衡过程中,协调器将不答复任何申请在从新均衡的分片地位的申请,即本地缓冲将持续进行,直到切换实现为止。负责从新均衡分片的 ShardRegion 将通过向其发送指定的 stopMessage(默认 PoisonPill)来进行该分片中的所有实体。当所有实体都终止后,领有实体的 ShardRegion 将向协调员确认切换已实现。尔后,协调器将回复对分片地位的申请,从而为分片调配新的地位,而后将 ShardRegion actor 中的缓冲消息传递到新地位。这意味着实体的状态不会被传输或迁徙。如果实体的状态很重要,则它应该是长久的(长久化),例如应用持久性(或参见经典持久性),以便能够在新地位复原它。
可插拔分片调配策略中定义了决定从新分片的逻辑。默认实现 ShardCoordinator.LeastShardAllocationStrategy 从具备最多先前调配的分片数量的 ShardRegion 中抉择分片进行切换。而后将它们调配给具备起码数量先前调配的分片的 ShardRegion(即群集中的新成员)。
对于 LeastShardAllocationStrategy,有一个可配置的阈值(rebalance-threshold),该阈值要求开始进行从新均衡时必须相差多大。分片最多的区域和分片起码的区域中的分片数量之差必须大于从新均衡阈值能力产生从新均衡。
从新均衡阈值 1 给出最佳散布,因而通常是最佳抉择。较高的阈值意味着能够同时从新均衡更多的分片,而不是一个接一个。这能够使从新均衡过程更快,然而不同节点之间的分片(因而负载)数量可能显着不同。
ShardCoordinator 状态
ShardCoordinator 中的分片地位状态对于分布式数据(或参见经典分布式数据)是长久(长久)的,以应答故障。
从集群中删除(通过故障)解体或无法访问的协调器节点后,新的 ShardCoordinator 单例 actor 将接管并复原状态。在这样的故障期间,具备已知地位的分片依然可用,而发送给新(未知)分片的音讯将被缓冲,直到新的 ShardCoordinator 可用为止。
音讯排序
只有发件人应用雷同的 ShardRegion actor 将消息传递到实体 actor,就将保留音讯的程序。只有未达到缓冲区限度,就以尽力而为的形式发送音讯,并具备至少一次的发送语义,形式与一般音讯发送雷同。
牢靠传递
通过应用“牢靠传递”性能,能够增加具备至多一次语义的牢靠的端到端消息传递。
开销
因为与协调器的往返途程,针对以新的或先前未应用的分片为指标的音讯引入了一些额定的提早。分片的从新均衡也可能会减少提早。在设计应用程序特定的分片分辨率(例如,防止太细的分片。晓得分片的地位后,惟一的开销就是通过 ShardRegion 而不是间接发送音讯。