Akka中停止actors的目的是什么?

3
我已阅读关于Akka容错和监管的文档,我认为我完全理解了它们,但有一个例外(无意冒犯)。
为什么你需要停止一个子Actor??
文档中唯一的提示是:
更接近Erlang的方式是,当子Actor失败时,只需停止子Actor,然后在监管者中采取纠正措施...
但对我来说,停止一个子Actor就像是说“不再执行这段代码”,这对我来说实际上等同于部署新更改以完全删除该Actor的代码:
- 每个Actor在Actor系统中扮演着至关重要的角色 - 简单地停止Actor意味着该Actor目前不再担任任何角色,并且假设系统现在可以以某种方式(神奇地)在没有该Actor的情况下工作 - 因此,对我来说,这与重构代码以不再具有Actor,然后部署这些更改没有任何区别。
我相信我只是没有看到这个问题的全貌,但我就是找不到任何使用案例,其中我会有一个大而复杂的演员系统,每个演员都做重要的工作,然后将其移交给下一个关键演员,但是我停止一个演员,整个系统就会神奇地继续完美地工作。
简而言之:对我来说,停止演员就像从运动车辆中拆卸传动装置。这怎么可能是好的/可取的事情?!?

总有人会对我的Akka问题进行负面投票。我感觉Akka用户指南编辑团队中的某个人对我有怨言,因为我指出了他们文档需要改进的地方!这个问题是相关的,不是重复的,并且是一个SSCCE(http://sscce.org)。为什么要负面投票呢? - smeeb
巴克斯特...是你吗?!?至少有勇气开口说话吧! - smeeb
这绝对是一个有效的问题,我可以担保Akka团队没有任何理由或愿望downvote那些在我们文档中指出遗漏的问题。但更好的解决方法是在github上开放问题,我只是偶然发现了这个问题。 - Roland Kuhn
3个回答

2
"错误内核"模式的本质是委托风险操作并保护必要状态,通常会为一次性操作生成子Actor,并在完成该操作并将其结果发送到其他位置时,需要停止子Actor或父Actor。(否则子Actor将保持活动/泄漏)

谢谢@Viktor Klang (+1) - 这是一个有趣的答案,我可能会决定撤销绿色勾选(抱歉znurgl)。当您说“否则子actor将保持活动/泄漏”时,您所说的泄漏是什么意思?我假设如果子actor没有任何工作要做,我们希望停止它(否则它只会占用资源),但不确定您所说的“泄漏”是什么意思,担心我在框架方面遗漏了一些重要信息。再次感谢! - smeeb
演员在停止之前一直处于活动状态,因此如果演员再也没有其他事情要做了,就需要将其停止。演员可以通过手动方式、监督方式或其父级演员停止来实现。 - Viktor Klang

1
如果儿童演员正在进行较长的过程,例如视频编码或某种文件转换,并且您必须部署新版本,则此时终止符号将有助于优雅地停止运行进程。

好的,我认为我明白了。我认为可以说Stop是一种特殊情况,不会成为错误处理生命周期的正常部分(也就是说,你通常不会在父级的SupervisorStrategy#Decider中停止一个子进程)。 - smeeb

0
每个Actor在演员系统中扮演着一些关键角色。这就是你遇到麻烦的地方,我可以创建一个子Actor来执行某项工作,例如对数据库执行查询或维护连接用户的状态,这是它唯一的目的。
一旦数据库查询完成或用户已优雅断开连接,子Actor就不再有任何作用,并且应该停止以释放它持有的任何资源。
简单地停止Actor意味着该Actor当前不再有任何角色,并假定系统现在可以在没有它的情况下(神奇地)工作。
系统能够继续运行,因为如果需要,我可以创建新的子Actor。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接