不要在父供应商actor重启时重新启动处理actor

Posted

技术标签:

【中文标题】不要在父供应商actor重启时重新启动处理actor【英文标题】:Don't restart processing actors on parent supplier actor restart 【发布时间】:2016-08-05 11:13:02 【问题描述】:

首先,我对 Akka 和演员模型还很陌生,所以也许我做错了一切。

我有一个输入actor,它从流源获取数据并将它们传递给具有一些内部状态的子处理器actor。如果连接断开,输入actor可能会崩溃,这会触发其重新启动。问题在于,这会触发其子代的重新启动,这会使它们失去状态。我不希望这样,因为输入流可能会恢复并且它们的状态将再次变得相关。此外,处理器是根据输入中的某些数据生成的,因此我看不到在输入参与者之外创建它们的方法。

换句话说,问题是“我如何只重新启动actor管道的输入而不重新启动进一步的阶段”?

【问题讨论】:

请看这个答案:***.com/questions/20528411/… 简短的回答是:不,如果不重新启动子actors,就无法重新启动父actor。您可以将参与者状态存储在 JVM 之外的某个位置(查看 akka 持久性)。 【参考方案1】:

基本上有 3 种类型的 Actor 重启原因 (1) 系统错误,例如发生异常时 (2) 暂时性错误,这完全是您正在处理的问题(连接丢失)和 (3) 内部损坏状态。因为你有一个父子关系,它的孩子会重新启动。在这一点上,我不确定您是否可以通过 SupervisionStrategy 处理它。因此,请看这里http://doc.akka.io/docs/akka/snapshot/general/supervision.html#What_Restarting_Means - 这也是我“引用”的来源

处理此问题的另一种方法可能是对您的连接进行容错处理。在这里你必须接近: (1) 将连接处理和错误处理放入一个单独的子角色中。底层监督策略将是 OneForOne(默认),这意味着如果孩子死了,只有孩子会重新启动。

(2) 你有两个根 Actor,它们将成为 Actor 系统的 Actor。一个 connectionActor 和您的 inputActor。您将把 connectionActor 的实例传递给 inputActor,或者反过来从 connectionActor 请求数据,或者将数据发送给 inputActor。

如果您是 akka-actors 的新手,这有点难。但我建议阅读文档的介绍(根据您使用的版本): http://doc.akka.io/docs/akka/snapshot/scala.html

【讨论】:

【参考方案2】:

这种情况的完美解决方案是使用 Akka Persistence。 将 akka-persistence 与您正在使用的数据库一起使用并保存参与者的内部状态

您可以在这里找到更多信息:http://doc.akka.io/docs/akka/current/scala/persistence.html

希望我解决了你的问题!谢谢:)

【讨论】:

以上是关于不要在父供应商actor重启时重新启动处理actor的主要内容,如果未能解决你的问题,请参考以下文章

(转)Akka学习笔记

Flink源码1-Flink 的集群和Jobmanager启动

分布式高并发下Actor模型

如何让IIS定时自动重新启动

Markpoint 打印机重启后打印头宽度重置

Actor初识