1

我在 Scala 中使用 Akka 演员来并行处理队列项目。我有一个带有 10 个可重复使用的子 ProcessorActor 的 MasterActor。

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

一切都很好,但现在我尝试为应用程序实现良好的容错能力,结果我无法获得有关在 Terminated 消息中失败的项目类型的太多信息。如果 ProcessorActor 失败,我需要在 MasterActor 中将适当的类型标记为可用于处理。现在我被困住了,因为我无法获得失败的项目类型。我在 Terminated 消息中有一个 ActorRef ,但是在我收到该消息后立即向它发送消息并不好。

最后,我可以将所有可能的类型都标记为“正在处理”,而实际上只有它们合适的演员已经死了。

请指教。

4

4 回答 4

1

看起来你想做的事情可以通过重新设计你的架构来拥有一个红色参与者、一个蓝色参与者和一个绿色参与者,并将监督策略设置为在参与者失败时重新启动而不是停止来实现。真的很简单。甚至不需要自己处理终止消息。

于 2013-03-19T10:01:43.750 回答
1

Terminated设置一些不向孩子提供新工作的“暂停”标志,如果他们有活动的工作,则 ping 所有,ProcessorActors如果可以分配任何工作 - 分配工作并释放“暂停”标志。如果在设置“暂停”标志时收到终止 - 再次执行 ping。

于 2013-03-18T23:01:01.337 回答
0

好吧,我终于做了什么,看起来最好的。我在其中设置了ProcessorActor故障重启策略和处理preRestart方法。如果reason:Option[Any]不为空并且匹配,StartProcessingMessage(Item(ItemType))那么我发送ProcessingFailedMessage(Item(ItemType))sender. 主管演员然后将类型标记为未处理,下一个while循环将由一些开始处理ProcessorActor,甚至可能是失败并刚刚重新启动的那个。

于 2013-03-20T08:57:55.870 回答
0

您可以在开始处理该项目之前ProcessorActor发送一条消息(带有项目类型) 。MasterActor在您的MasterActor情况下,您可以维护一个Map[ActorRef, ItemType]使用,您可以通过ActorRef(在消息中收到)确定死亡Terminated时正在处理的最后一个项目类型。ProcessorActor

于 2013-03-19T08:48:44.707 回答