不要在父供应商参与者重新启动时重新启动处理参与者



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

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

换言之,问题是"如何在不重新启动进一步阶段的情况下仅重新启动actor管道的输入"?

参与者重新启动的原因主要有三种:(1(系统错误,例如发生异常时;(2(瞬态错误,这完全是你正在处理的事情(连接丢失(;(3(内部状态损坏。因为您有父子关系,所以将重新启动其子关系。在这一点上,我不确定你是否可以通过监管策略来处理它。因此,请看这里http://doc.akka.io/docs/akka/snapshot/general/supervision.html#What_Restarting_Means-这也是我"引用"的来源

另一种处理方法可能是对连接进行容错处理。以下是您必须采取的方法:(1( 将连接处理和错误处理放在一个单独的子参与者中。基本的监督策略将是OneForOne(默认(,这意味着如果孩子死亡,只有孩子会重新启动。

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

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

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

你可以在这里找到更多关于它的信息:http://doc.akka.io/docs/akka/current/scala/persistence.html

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