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而不是间接发送音讯。