【问题标题】:restoring akka entity actor during node outage在节点中断期间恢复 akka 实体参与者
【发布时间】:2021-07-10 14:44:24
【问题描述】:

Akka-Cluster 模块用于应用程序内的集群。

如果我们有一个设置,其中一个节点上运行的实体参与者(我们可能有数百个分布在节点上的参与者)被安排为每 1 分钟接收一次消息,(使用 Timers/Scheduler),当节点是主持演员优雅地和不优雅地关闭

我们如何确保在另一个节点上自动创建实体actor。实体actor是仅在接收到第一条消息时才创建,还是会在应用程序中没有任何逻辑的情况下自动创建。此外,演员的调度程序会发生什么。调度程序可以在演员迁移到其他节点后自动运行。请注意,到目前为止我不打算使用持久性?但它是否有助于自动实体创建和消息调度的持久性

【问题讨论】:

    标签: java akka akka-cluster akka-persistence


    【解决方案1】:

    如果实体 Actor 是使用集群分片管理的,您可以使用 remember entities 自动使实体保持活动状态,直到实体自身钝化。在没有可靠的持久存储附加到实例的 Kubernetes 或类似环境中,这确实需要 Akka Persistence。

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

    请注意,在重新平衡之后,实体 Actor 的状态不会恢复,除非实体 Actor 以某种方式持久化(例如,它本身是使用 Akka Persistence 的事件源)。该状态将包括计时器状态。实体actor被重新创建(通常使用Behaviors.setup(我忘记了Java API是否使用该名称)),因此取决于actor应该如何响应该消息:

    • 如果“每分钟”的意思是“每分钟不超过一次”,那么实体 Actor 应该开始安排每分钟作为其设置的一部分;如果崩溃/重新平衡发生在最后一条预定消息的 59 秒后,就会有间隙,但如果消息导致,例如,轮询某些外部资源,那么间隙可能最终就无关紧要了。

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

    【讨论】:

    • 只是添加到这个。默认情况下,记住实体功能使用 Akka 的分布式数据来记住哪些实体是活动的。此信息在集群节点之间保持同步,因此数据可以在节点崩溃后幸存下来,但不会在整个集群崩溃后幸存下来。如果这是你想要防范的东西,就像@levi-ramsey 说的那样,Akka Persistence 可以在一些持久存储中记住集群外部的实体。
    • 我应该澄清一下,“这个状态将包括定时器状态”并不意味着定时器状态会被持久化并自动恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2011-07-26
    相关资源
    最近更新 更多