我正在使用带有Scala 2.12.2的Akka 2.5.2。
sharding doc提到为了使崩溃/重新平衡的分片恢复其实体,ShardRegion.ExtractShardI
必须处理ShardRegion.StartEntity
消息。
如果实体本身需要恢复其内部状态,则必须实现PersistenceActor
。为此,实体必须具有唯一的persistenceId
。
问题是,当一个实体重新启动时,它如何找到它的persistenceId
?这是由ShardRegion
演员传入的吗?
答案 0 :(得分:1)
否:分片角色不会收到(afaik)本地节点区域消耗的StartEntity消息。
persistenceId是你从PersistentActor特征中覆盖的东西,你必须在稳定的方式中定义自己(即在重新启动时总是相同)。
通常,你将persistenceId与entityId绑定,后者通常可以使用self().path().name()
解决此问题的一种方法是确保发送到分片actor的所有消息都包含entityId,或者包含在“envelope”类中,或者通过公开sortId(与提取器相同)使用)。