我在Scala中使用Akka actor来并行处理队列项。我有一个MasterActor,有10个可重用的子ProcessorActors。
正在处理的项目可以是不同类型,例如红色,蓝色和绿色物品。在某个时刻,只能处理某种类型的单个项目。因此,如果正在处理一个红色项目,则不能再同时处理红色。
一切都很好,但现在我尝试为应用程序实现良好的容错能力,事实证明我无法获得有关终止消息中哪些项目类型失败的信息。如果ProcessorActor失败,我需要在MasterActor中标记适当的类型以供处理。现在我被卡住,因为我无法得到什么项目类型失败。我在终止消息中有一个ActorRef但是afaiu在收到消息后立即向它发送消息是不好的。
最后,我可以留下标记为“正在处理”的所有可能类型,而实际上只是他们适当的演员已经死了。
请建议。
答案 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
的处理,甚至可能是失败并刚刚重新启动的那个。