【问题标题】:What is the purpose of stopping actors in Akka?在 Akka 中阻止演员的目的是什么?
【发布时间】:2016-01-13 15:51:03
【问题描述】:

我已经阅读了 Akka docs on fault tolerance & supervision,并且我认为我完全理解它们,但有一个很大的例外(没有双关语)。

你为什么想要/需要阻止儿童演员???

文档中的唯一线索是:

更接近 Erlang 方式的策略是在孩子失败时阻止他们,然后在主管中采取纠正措施......

但对我来说,停止一个孩子就等于说“不要再执行此代码”,对我来说,这实际上与部署相同完全删除该参与者的代码的新更改:

  • 每个 Actor 在 Actor 系统中都扮演着一些关键角色
  • 简单地停止演员意味着演员目前不再拥有角色,并假设系统现在可以以某种方式(神奇地)在没有它的情况下工作
  • 同样,对我而言,这与将代码重构为甚至不再有演员,然后部署这些更改没有什么不同

我敢肯定,我只是在这个上看不到森林,但我只是没有看到任何用例,其中我有这个大型复杂的演员系统,每个演员都在做关键的工作和然后把它交给下一个关键演员,然后我停止一个演员,神奇地整个系统继续完美运行。

简而言之:阻止演员(对我而言)就像从行驶中的车辆上拆下变速箱。这怎么可能是一件好事/理想的事情?!?

【问题讨论】:

  • 总是有人通过我的 Akka 问题并否决我的问题。我觉得 Akka 的用户指南编辑团队中的某个人对我怀恨在心,因为我指出了他们的文档需要改进的地方! 这个问题是主题,不是骗子,而是SSCCE。为什么投反对票?
  • 巴克斯特……是你吗?!?至少有勇气说话!
  • 这绝对是一个有效的问题,我可以向 Akka 团队保证,我们没有理由或不想对那些在我们的文档中引起遗漏的问题投反对票。但是修复它们的更好方法是在 github 上打开问题,我偶然发现了这个。

标签: akka fault-tolerance


【解决方案1】:

“错误内核”模式的本质是委托有风险的操作并保护基本状态,通常为一次性操作生成子角色,当该操作完成并将其结果发送到其他地方时,子角色或父角色需要停止它。 (否则子actor将保持活跃/泄漏)

【讨论】:

  • 感谢@Viktor Klang (+1) - 这是一个有趣的答案,我可能会决定恢复绿色检查(抱歉 znurgl)。当您说“否则子演员将保持活动/泄漏”时,泄漏是什么意思?我假设我们想阻止子演员,如果它没有任何工作要做(否则它只是占用资源),但不确定您所说的“泄漏”是什么意思,并且担心我的框架有一些大问题我在这里失踪了。再次感谢!
  • Actor 在停止之前都是活着的,所以如果一个 Actor 永远没有其他事情可做,它需要被停止。 Actor 可以手动停止,也可以通过监督停止,也可以在其父 Actor 停止时停止。
【解决方案2】:

如果子 Actor 正在执行可以安全终止的较长过程,例如视频编码或某种文件转换,并且您必须部署新版本,那么终止标志对于停止运行很有用优雅地处理。

【讨论】:

  • 好的,我认为我明白了。我认为公平地说 Stop 是一种特殊的用例,不会是错误处理生命周期的正常部分(意思是,您通常不会从父母的内部阻止孩子SupervisorStrategy#Decider)。
【解决方案3】:

每个 Actor 在 Actor 系统中都扮演着重要的角色

这是你遇到麻烦的地方,我可以创建一个子actor来完成一项工作,例如对数据库执行查询或维护连接用户的状态,这是它的唯一目的。

一旦数据库查询完成或用户正常断开连接,子actor就不再扮演任何角色,应该停止它,以便释放它持有的任何资源。

简单地停止actor意味着actor当前不再具有角色,并且假定系统现在可以以某种方式(神奇地)在没有它的情况下工作

系统能够继续运行,因为我可以在需要时/在需要时创建新的子演员。

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 2017-03-18
    • 1970-01-01
    • 2014-12-20
    • 2019-01-01
    • 2023-03-03
    • 2020-05-12
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多