使用AKKA集群分片时如何处理JVM崩溃

使用AKKA集群分片时如何处理JVM崩溃,akka,sharding,Akka,Sharding,我正在练习Akka群集切分功能。 我使用分片功能在3个节点中启动了几个实体。 但我不知道当一个节点崩溃时,如何在其他节点中恢复实体 有人能帮助我理解我是如何做到这一点的吗。切分功能是我在开源项目中见过的最强大的功能之一。 我使用akka 2.3.12版本进行切分,在过去的23年中已经取得了成功。 作为一个规则,每个节点大约需要10个碎片,但是我的部署使用5个节点,每个节点有20个碎片,效果很好 必须理解的是,分片只是一种路由逻辑,它为您提供位置透明性,让您知道由分片功能管理的参与者实际实例化的位

我正在练习Akka群集切分功能。 我使用分片功能在3个节点中启动了几个实体。 但我不知道当一个节点崩溃时,如何在其他节点中恢复实体


有人能帮助我理解我是如何做到这一点的吗。

切分功能是我在开源项目中见过的最强大的功能之一。 我使用akka 2.3.12版本进行切分,在过去的23年中已经取得了成功。 作为一个规则,每个节点大约需要10个碎片,但是我的部署使用5个节点,每个节点有20个碎片,效果很好

必须理解的是,分片只是一种路由逻辑,它为您提供位置透明性,让您知道由分片功能管理的参与者实际实例化的位置(什么节点,什么分片)

现在关于演员的恢复:
如果您的参与者已通过发送的命令累积状态,这对您的业务非常重要,这意味着您必须持久化接收到的命令,并能够从所有节点可用的持久性中恢复(CQR&事件源)。由于akka提供了这些功能,本文档结构非常完善,为您提供了有关如何实现恢复的足够信息。作为一个持久性源代码,我使用了带有C*插件的akka持久性-详细信息

感谢Vasile的及时回答。是的,我知道Akka持久性,我尝试了最简单的持久性插件:shared leveldb,但似乎不起作用。我所做的是:启动Akka系统的3个实例,使用sharding功能发送请求消息,然后创建shard及其实体,之后我手动杀死了一个实例,所以这个实例变得“不可检查”,然后我再次启动了同一个实例,所以节点状态再次变为“向上”,但是我没有看到在这个节点中恢复的碎片和实体,我应该如何为重新启动的节点恢复碎片和实体?让我们假设您的参与者(由碎片管理的参与者)持久化每个接收到的命令,并且您在recover方法中有它的逻辑,让我们使用持久化id调用这个参与者SMPA(碎片管理的持久化参与者)“smpa”和发送的EntryEnvelope消息X已设置为到达该演员。当您的制作人(在akka 1中)第一次使用分片区域参与者发送此mesaage X,SMPA尚未实例化,当消息X由分片区域处理时,尝试查找此参与者失败,因此分片协调器将通知该区域此参与者是在akka 2中创建的。在您取下akka 2后,您的制作者向SMPA发送另一条消息,即reg来自akka 1的ion将无法到达其最后一个已知地址,并将尝试与协调器进行检查(在akka 1-领导者节点中)现在决定在akka 3中实例化SMPA,现在如果akka 3能够访问SMPA的最后一个实例,那么在恢复后,您的消息将到达这个新实例。希望不会出现太长的文本。切分是如何工作的,很好的文档-再次感谢您的解释。所以我理解的是,这是一个新实例ed再次发送另一条消息以触发此SMPA重新安装(恢复)。我想要的是,SMPA可以在其他节点(例如Akka3)中自动重新启动当JVM崩溃时,因为在我的例子中SMPA actor正在进行流计算,而不是请求/响应计算,所以我希望SMPA actor在JVM崩溃时自行恢复,并且客户端不需要知道后端计算器崩溃并再次发送相同的消息以重新启动它,这个函数是否可能你有吗?