阿卡 - 从被终止的演员获取信息

时间:2013-03-18 21:32:24

标签: scala akka actor

我在Scala中使用Akka actor来并行处理队列项。我有一个MasterActor,有10个可重用的子ProcessorActors。

正在处理的项目可以是不同类型,例如红色,蓝色和绿色物品。在某个时刻,只能处理某种类型的单个项目。因此,如果正在处理一个红色项目,则不能再同时处理红色。

一切都很好,但现在我尝试为应用程序实现良好的容错能力,事实证明我无法获得有关终止消息中哪些项目类型失败的信息。如果ProcessorActor失败,我需要在MasterActor中标记适当的类型以供处理。现在我被卡住,因为我无法得到什么项目类型失败。我在终止消息中有一个ActorRef但是afaiu在收到消息后立即向它发送消息是不好的。

最后,我可以留下标记为“正在处理”的所有可能类型,而实际上只是他们适当的演员已经死了。

请建议。

4 个答案:

答案 0 :(得分:1)

Terminated上设置一些'暂停'标志,表示不向子项提供新作业,如果有活动作业,则ping所有ProcessorActors,如果可以分配任何作业 - 分配作业并释放'暂停'旗帜。如果在设置'pause'标志时收到终止 - 再次ping。

答案 1 :(得分:1)

看起来你想要做的只是通过重新设计你的架构来拥有一个红色演员,一个蓝色演员和一个绿色演员,并设置监督策略来重新设置演员失败,而不是停止。真的很简单。甚至不需要自己处理终止消息。

答案 2 :(得分:0)

您的ProcessorActor可以在开始处理项目之前向MasterActor发送消息(包含项目类型)。在您的MasterActor中,您可以维护一个Map[ActorRef, ItemType]使用,您可以通过ActorRef(在Terminated消息中收到)确定正在处理的最后一个项目类型{{1}死了。

答案 3 :(得分:0)

好的,我最终做了什么,看起来最好。我在ProcessorActor失败时设置了重启策略,并在其中处理preRestart方法。如果reason:Option[Any]不为空且匹配StartProcessingMessage(Item(ItemType)),则我会向ProcessingFailedMessage(Item(ItemType))发送sender。然后,Supervisor actor将类型标记为未处理,下一个while循环将启动某些ProcessorActor的处理,甚至可能是失败并刚刚重新启动的那个。