akka持久性,失败时恢复,至少一次语义

时间:2017-04-20 18:54:27

标签: akka akka-persistence

我头上乱七八糟 避免中毒邮箱 http://doc.akka.io/docs/akka/2.4.2/general/supervision.html

  

然后新演员恢复处理其邮箱,这意味着   在着名的演员本身之外看不到重启   发生故障的消息不是例外   再加工。

我的情况:actor收到运行smth的“命令”。演员试图达到远程服务。服务不可用。抛出异常。我希望演员继续联系远程服务器。我不想演员跳过引起异常的输入命令。 恢复会帮助我强迫演员继续前进吗?

override val supervisorStrategy: SupervisorStrategy =
    OneForOneStrategy(maxNrOfRetries = -1, withinTimeRange = 5.minutes) {
      case _: RemoteServiceIsDownException => Resume
      case _ => Stop
    }

通过恢复,我的意思是重试导致引发异常的调用。我怀疑akka Resume 意味着保留actor实例,但不重试失败的调用

akka持久性是否意味着持久邮箱?

扩展第一个案例。演员试图达到远程服务。现在演员是执着的。 SupervisorStrategy迫使Actor继续联系远程服务。整个JVM关闭了。 Akka应用程序重新启动。演员恢复会不会累积到达远程服务?

akka持久性是否意味着至少一次语义?

演员收到消息。然后JVM崩溃了。父母会重新接收暗恋期间正在处理的消息吗?

1 个答案:

答案 0 :(得分:1)

扩展我的评论:

  

Will Resume会帮助我强迫演员继续前进吗? ...通过Resume,我的意思是重试引发异常的调用。我怀疑akka Resume意味着保留actor实例,但不重试失败的调用

不,我不相信。在您的消息处理失败后,Resume指令将使演员继续前进。然而,尝试重试消息的一种方法是实际使用Restart并利用Actor的{​​{1}}挂钩:

preRestart

当演员崩溃时,它将运行此挂钩并为您提供处理导致其失败的消息的机会。

  

akka持久性是否意味着持久的邮箱?

不一定,使用持久化actor只意味着actor的域事件,以及随后的内部状态是持久的,而不是它用于处理消息的邮箱。话虽这么说,可以很容易地实现一个持久的邮箱,见下文。

  

akka持久性是否意味着至少一次语义?

同样不一定,但工具包确实有一个名为override def preRestart(t: Throwable, msgBeforeFailure: Option[Any]): Unit = { case t: RemoteServiceIsDownException if msgBeforeFailure.isDefined => self ! msgBeforeFailure.get case _: => } 的特性,可以让你实现这个(和持久邮箱)!

请参阅http://doc.akka.io/docs/akka/current/scala/persistence.html#At-Least-Once_Delivery