在使用Future时我还需要做什么来支持容错,如下面的代码所示?
...
override def receive = {
case email: Email => Future {
// Suppose here I got an exception. Without "Future", supervisor strategy
// works well restarting the actor
throw new MailException("ops!")
}
}
主管策略:
...
withSupervisorStrategy(
OneForOneStrategy(
// Max number of retries
maxNrOfRetries = retries,
// Time Window
withinTimeRange = timeRange) {
case ex: MailException => {
Restart
}
}))
答案 0 :(得分:4)
它可能会有点复杂,因为在Future完成时,Actor可能已经处理了其他消息。
在这种情况下,未来甚至意味着失败?如果这意味着Actor已损坏且应该重新启动,那么在过渡期间处理的消息的有效性是什么?
这一切都取决于上下文,以及你的Actor + Future究竟发生了什么,但它几乎归结为两种选择:
Actor仍然有效且不需要重新启动,但您仍需要为将来的结果执行一些明确的错误处理/恢复
演员无效。我在这里假设所有临时消息也将在期货中处理,这也将失败。当一个未来失败时,您可以向演员发送一条消息,该消息将导致它抛出异常以供您的主管策略选择...
......当然,选择#2会让事情变得很复杂。你必须考虑多个期货连续失败。你如何防止多次重启消息?如果未来在重新启动之前启动但未在之后失败,您如何应对?
TL; DR - 在像这样的演员中使用期货不与监督很好地互动。不要在未来做可能需要重启的事情;尝试使用池化的actor或嵌套的worker actor。