不要重新启动父供应商actor重启的处理参与者

时间:2016-08-05 11:13:03

标签: java scala akka actor

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

我有一个输入actor,它从流源获取数据并将它们传递给具有某种内部状态的子处理器actor。如果连接死亡,输入actor可能会崩溃,从而触发重启。问题是此外还会触发其子节点的重启,这会使它们失去状态。我不希望这样,因为输入流可能会恢复,并且它们的状态将再次变得相关。此外,处理器是针对输入中的某些数据而产生的,所以我没有看到在输入actor之外创建它们的方法。

换句话说,问题是"如何重新启动actor管道的输入而不重新启动其他阶段"?

2 个答案:

答案 0 :(得分:1)

基本上有三种类型的原因让Actor重新启动(1)系统错误,例如当发生异常时(2)瞬态错误,这完全是你正在处理的东西(连接丢失)和(3)腐败的内部州。因为您有父子关系,所以将重新启动其子项。在这一点上,我不确定你是否可以通过SupervisionStrategy处理它。因此,请查看此处http://doc.akka.io/docs/akka/snapshot/general/supervision.html#What_Restarting_Means - 它也是来源Iam"引用)

处理此问题的另一种方法可能是容错处理您的连接。在这里你必须采取措施: (1)将连接处理和错误处理放入单独的子actor中。潜在的监督策略将是OneForOne(默认),这意味着如果孩子死亡,孩子将重新启动。

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

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

答案 1 :(得分:0)

此案例的完美解决方案是使用Akka Persistence。 将akka-persistence与您正在使用的db一起使用,并保存actor的内部状态

您可以在此处找到更多相关信息:http://doc.akka.io/docs/akka/current/scala/persistence.html

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