首先,我对Akka和演员模型都很陌生,所以也许我做错了。
我有一个输入actor,它从流源获取数据并将它们传递给具有某种内部状态的子处理器actor。如果连接死亡,输入actor可能会崩溃,从而触发重启。问题是此外还会触发其子节点的重启,这会使它们失去状态。我不希望这样,因为输入流可能会恢复,并且它们的状态将再次变得相关。此外,处理器是针对输入中的某些数据而产生的,所以我没有看到在输入actor之外创建它们的方法。
换句话说,问题是"如何重新启动actor管道的输入而不重新启动其他阶段"?
答案 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
我希望我解决了你的问题!谢谢:))