Java 在节点中断期间恢复akka实体参与者

Java 在节点中断期间恢复akka实体参与者,java,akka,akka-cluster,akka-persistence,Java,Akka,Akka Cluster,Akka Persistence,Akka集群模块用于在应用程序内进行集群 如果我们有一个设置,其中一个运行在节点上的实体参与者(可能有数百个参与者分布在节点上)计划每1分钟接收一次消息(使用计时器/调度器),那么当承载参与者的节点正常和不正常关闭时会发生什么情况 如何确保在另一个节点上自动创建实体参与者。实体参与者是仅在收到第一条消息时创建的,还是在应用程序中没有任何逻辑的情况下自动创建的。另外,参与者的调度程序会发生什么情况。迁移到其他节点后,是否可以在参与者上自动运行调度程序。。注意到目前为止,我还没有计划使用持久性?但是

Akka集群模块用于在应用程序内进行集群

如果我们有一个设置,其中一个运行在节点上的实体参与者(可能有数百个参与者分布在节点上)计划每1分钟接收一次消息(使用计时器/调度器),那么当承载参与者的节点正常和不正常关闭时会发生什么情况


如何确保在另一个节点上自动创建实体参与者。实体参与者是仅在收到第一条消息时创建的,还是在应用程序中没有任何逻辑的情况下自动创建的。另外,参与者的调度程序会发生什么情况。迁移到其他节点后,是否可以在参与者上自动运行调度程序。。注意到目前为止,我还没有计划使用持久性?但是拥有持久性是否有助于自动创建实体和安排消息

如果使用集群分片管理实体参与者,则可以使用自动保持实体活动,直到实体自身钝化。在kubernetes或类似的环境中,没有可靠的持久性存储连接到实例,这确实需要Akka持久性

如果不使用集群分片,那么您可能必须使用持久性实现类似的功能

请注意,在重新平衡之后,实体参与者的状态不会恢复,除非该实体参与者以某种方式是持久的(例如,通过使用Akka持久性自身作为事件源)。此状态将包括计时器状态。重新创建实体参与者(最典型的是使用
Behaviors.setup
(我忘了Java API是否使用该名称)),因此取决于参与者应如何响应该消息:

  • 如果“每分钟”的意思是“每分钟不超过一次”,那么实体参与者应该开始安排每分钟的时间,作为其设置的一部分;如果崩溃/重新平衡发生在最后一条计划消息59秒后,则会有一个间隔,但如果消息导致(例如)轮询某些外部资源,那么间隔最终可能并不重要

  • 如果“每分钟”表示“至少每分钟一次”,那么实体参与者可以立即向自己发送预定消息并设置计时器。然后,如果崩溃/重新平衡发生在上一个计划消息之后,则计划消息的效果之间的时间间隔将比正常时间短,但不会有多分钟的间隔


只是为了补充这一点。默认情况下,“记住实体”功能使用Akka的分布式数据来记住哪些实体是活动的。此信息在群集节点之间保持同步,因此数据在节点崩溃后仍然有效,但不会在整个群集崩溃后仍然有效。如果这是你想要防范的事情,就像@levi ramsey说的那样,你需要Akka持久化来记住集群之外的实体,在一些持久化存储中。我应该澄清,“这个状态将包括计时器状态”并不意味着计时器状态将被持久化并自动恢复。