【问题标题】:Akka - Getting info from terminated actorAkka - 从终止的演员那里获取信息
【发布时间】:2013-03-18 21:32:24
【问题描述】:

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

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

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

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

请指教。

【问题讨论】:

    标签: scala akka actor


    【解决方案1】:

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

    【讨论】:

    • 好的,但这并不能解决识别哪些作业失败的问题。我怎样才能得到被终止的具体演员?我在 Terminated 消息中有 ActorRef,但它不允许通过该引用获取真正的 ProcessorActor。
    • 我的主要设计点是不允许同时进行 2 个绿色工作。您可以只计算 ping 上的作业,然后分配剩余的作业 - 例如,您有 1 个蓝色 1 个绿色 1 个红色。蓝色失败,然后绿色似乎在终止处理期间完成 - 分配蓝色和绿色,忽略来自绿色的下一条消息......考虑到具体的ProcessorActor - 你在 Akka 中没有任何具体的参与者,尤其是远程参与者 - 只有可以通信的引用通过消息。
    【解决方案2】:

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

    【讨论】:

    • 不错的选择,虽然类型的数量没有预定义,并且会在程序运行时更改。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2014-12-02
        • 2020-08-20
        • 2014-07-11
        • 1970-01-01
        相关资源
        最近更新 更多