【问题标题】:Akka Kill vs. Stop vs. Poison Pill?阿卡杀VS停VS毒丸?
【发布时间】:2012-11-30 15:23:39
【问题描述】:

Akka 的新手问题 - 我正在阅读 Akka Essentials,有人可以解释 Akka Stop/Poison Pill 与 Kill 之间的区别吗?这本书只提供了一个小解释“杀死是同步的,而毒丸是异步的”。但以什么方式?在此期间调用参与者线程是否锁定?在杀戮、停止后诱发等过程中是否通知了儿童演员?一个概念与另一个概念的示例用法?

非常感谢!

【问题讨论】:

  • rs_atl 回答得非常好,让我补充一点,关于演员的任何内容都不是同步的,甚至 context.stop(self) 也不是。
  • @RolandKuhn context.become 怎么样?
  • context.become 指定要应用于下一条消息的行为,即在当前消息处理完后生效;在这方面它很像context.stop(self)

标签: scala akka


【解决方案1】:

stopPoisonPill 都会终止参与者并停止消息队列。它们将导致actor停止处理消息,向其所有子节点发送停止调用,等待它们终止,然后调用其postStop钩子。所有进一步的消息都发送到死信邮箱。

不同之处在于在此序列开始之前处理哪些消息。在stop 调用的情况下,当前正在处理的消息首先完成,所有其他消息都被丢弃。当发送PoisonPill 时,这只是队列中的另一条消息,因此序列将在收到PoisonPill 时开始。队列中所有在它前面的消息都会被首先处理。

相比之下,Kill 消息会导致 actor 抛出一个 ActorKilledException,它会使用正常的监督机制进行处理。因此,这里的行为取决于您在主管策略中定义的内容。默认是停止actor。但是邮箱仍然存在,所以当actor重新启动时,除了导致失败的那条之外,它仍然会保留旧消息。

另请参阅文档中的“停止演员”、“杀死演员”部分:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

还有更多关于监督策略的信息:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

【讨论】:

  • 优秀的回答谢谢,应该贴在Akka教程上!
  • Kill 消息不会导致 Actor 使用正常的监督机制重新启动,除非您使用非默认监督策略,因为 ActorKilledException 解析为停止,而不是重新启动。
  • 其实这很烦人,因为重启actor的唯一内置方法就是抛出异常。
  • 或者从监督演员发送 PoisonPill 到应该重新启动的演员并重新开始。
  • 使用context.stop(self)有什么区别吗?
【解决方案2】:

PoisonPill 在处理完所有接收到邮箱的消息后,在 PoisonPill 之前异步停止actor。

【讨论】:

  • 不,Kill 没有任何特殊的优先级,就像 PoisonPill 一样
【解决方案3】:

尽可能使用 PoisonPill。它被放在邮箱上,并像任何其他消息一样被使用。您还可以在演员中使用“context.stop(self)”。

【讨论】:

    【解决方案4】:

    您可以同时使用actor stop 和毒丸来停止actor 的处理,并使用kill 来完全终止actor。 x.stop 是您在 akka 接收方法中进行的调用,只会在调用 postStop 后用新的 actor 替换 actor 状态。 X ! PoisonPill 是您传递给 actor 以在 actor 运行时停止处理的方法(推荐)。调用 postStop 后也将替换 actor 状态。 x.kill 将终止actor,并移除actor Path 中的actor,并将整个actor 替换为新的actor。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2021-01-23
      • 2018-08-06
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 2012-03-17
      • 2011-06-03
      相关资源
      最近更新 更多