1.概述

转载:Akka容错处理

1.1 监督(Supervision)

容错(fault tolerance)概念与 Actor 相关,Actor 模型中容错处理使用叫做监督(supervision)处理。监督的核心思想就是把对于失败的响应和可能引起失败的组件分隔开,并且把可能发生错误的组件通过层级结构来组织,以便管理。

在分布式系统中每个组件都是一个定时炸弹,那么我们希望能够确保无论其中任何一个发生爆炸,都不会引发链式反应,导致其他组件也爆炸。也可以说,我们希望能够隔离错误,或是将可能引发失败情况的组件分离开来。

1.2 监督的层级结构

Akka 使用 Actor 层级结构来描述监督。当我们创建 Actor 时,新建的 Actor 都是作为另一个 Actor 的子 Actor,父 Actor 负责监督子 Actor。Actor 的路径结构就展示了它的层级结构,所以和文件系统中的文件夹有点像。

1.3 监督策略

在Akka框架内,父Actor对子Actor进行监督,监控子Actor的行为是否有异常。大体上,监控策略分为两种:

  • OneForOneStrategy策略:父Actor只会对出问题的子Actor进行处理。比如重启或停止。Akka的默认策略,推荐使用。
  • AllForOneStrategy策略:父Actor会对出问题的子Actor以及它所有的兄弟节点都进行处理。只适用于各个Actor联系非常紧密的场景,如果多个Actor只要有一个失败,则宣布整个任务失败的情况。

Actor中具体的处理方式主要包括以下:

继续(resume) :Actor 继续处理下一条消息;
停止(stop) :停 止 Actor,不再做任何操作;
重启(restart) :新建一个 Actor,代替原来的 Actor;
向上反映(escalate) :将异常信息传递给下一个监督者。

1.4 创建监督策略

public class JavaSupervisorStrategyDemo extends AbstractActor {private static SupervisorStrategy strategy =new OneForOneStrategy(10,Duration.create("1 minute"),/** resume(): Actor 继续处理下一条消息;* restart():  停 止Actor,不再做任何操作;* escalate(): 新建一个 Actor,代替原来的 Actor;* stop(): 将异常信息传递给下一个监督者;*/DeciderBuilder.match(ArithmeticException.class, e -> SupervisorStrategy.resume()).match(NullPointerException.class, e -> SupervisorStrategy.restart()).match(IllegalArgumentException.class, e -> SupervisorStrategy.stop()).matchAny(o -> SupervisorStrategy.escalate()).build());@Overridepublic SupervisorStrategy supervisorStrategy() {return strategy;}
}

一对一策略(one-for-one strategy)意味着每个子级都被单独对待。在上面的示例中,10和Duration.create(1, TimeUnit.MINUTES)分别传递给maxNrOfRetries和withinTimeRange参数,这意味着策略每分钟重新启动一个子级最多10次。如果在withinTimeRange持续时间内重新启动计数超过maxNrOfRetries,则子 Actor 将停止。

如果策略在监督者 Actor(而不是单独的类)中声明,则其决策者可以线程安全方式访问 Actor 的所有内部状态,包括获取对当前失败的子级的引用,可用作失败消息的getSender()。

1.5 默认监督策略

一般情况下使用默认的行为就可以了:如果 Actor 在运行中抛出异常,就重启 Actor;如果发生错误,就向上反映或是关闭应用程序。不过如果 Actor 在构造函数中抛出异常,那么会导致 ActorInitializationException,并最终导致 Actor 停止运行。

如果没有为 Actor 定义监督策略,则默认情况下会处理以下异常:

ActorInitializationException将停止失败的子 Actor
ActorKilledException将停止失败的子 Actor
DeathPactException将停止失败的子 Actor
Exception将重新启动失败的子 Actor
其他类型的Throwable将向上反映到父级 Actor

如果异常一直升级到根守护者,它将以与上面定义的默认策略相同的方式处理它。

1.6 停止监督策略

在子级失败时采取措施阻止他们,然后在DeathWatch显示子级死亡时由监督者采取纠正措施。此策略还预打包为SupervisorStrategy.stoppingStrategy,并附带一个StoppingSupervisorStrategy配置程序,以便在您希望/user下监护人应用它时使用。

1.7 记录 Actor 的失败

默认情况下,除非向上反映escalate,否则SupervisorStrategy会记录故障。escalate的故障应该在层次结构中更高的级别处理并记录下来。

通过在实例化时将loggingEnabled设置为false,可以将SupervisorStrategy的默认日志设置为静音。定制的日志记录可以在Decider内完成。

请注意,当在监督者 Actor 内部声明SupervisorStrategy时,对当前失败的子级的引用可用作sender。

你还可以通过重写logFailure方法自定义自己的SupervisorStrategy中的日志记录。

【Akka】Akka容错处理相关推荐

  1. Scala消息通信之akka,akka案例

    #Scala编程实战 ##一. 课程目标 ###1. 目标:熟练使用Scala编写程序 ##二. 项目概述 ###1. 需求 目前大多数的分布式架构底层通信都是通过RPC实现的,RPC框架非常多,比如 ...

  2. 分布式应用框架Akka快速入门

    转自:分布式应用框架Akka快速入门_jmppok的专栏-CSDN博客_akka 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akk ...

  3. Akka是个什么鬼?

    What is Akka?Akka是什么? Scalable real-time transaction processing 可伸缩实时事务处理 We believe that writing co ...

  4. akka 与kafka

    akka 并发编程框架 kafka 高吞吐量分布式消息系统 akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. Actor ...

  5. java akka 实战_akka集群实战

    关于akka akka是JAVA虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时.Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口. Akka处理并发的方法基于Ac ...

  6. Scala系列-5、scala中的泛型、actor、akka

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala的 泛型 给方法定义泛型 给类定义泛型 泛型的上下 ...

  7. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

  8. akka框架——异步非阻塞高并发处理框架

    akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...

  9. [转] AKKA简介

    [From] https://blog.csdn.net/linuxarmsummary/article/details/79399602 Akka in JAVA(一) AKKA简介 什么是AKKA ...

  10. AKKA文档(java版)——准备开始

     http://ifeve.com/akka-doc-java-getting-started/ AKKA文档(java版)--准备开始 原文:http://doc.akka.io/docs/ak ...

最新文章

  1. MySQL连接问题【如何解决MySQL连接超时关闭】
  2. vim 的 grep 插件`Leaderf rg`:grep 和模糊匹配的完美结合
  3. Open3D编译安装
  4. 装饰工程预结算教程电子书_东北分公司举行工程预结算实战技能培训
  5. Visual studio 打包
  6. java并发编程之4——Java锁分解锁分段技术
  7. 微信分享JS-SDK示例页面
  8. scala不可变和可变_Scala使期货变得轻松
  9. SyntaxError: unexpected EOF while parsing成功解决
  10. 开源cms系统We7插件开发准备工作全面就绪
  11. 读书笔记-《人为什么活着》
  12. unity现代人物含代码动画_Unity Animation--动画系统概述
  13. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
  14. 使用UCDOS的HZK16点阵字库的演示程序
  15. 多渠道归因分析(Attribution):python实现Shapley Value(四)
  16. 谷歌翻译SDK (Google Translate SDK)的使用
  17. Nand2Tetris 计算机结构
  18. java导出excel 边框不全_POI导出excel,合并单元格后没有边框
  19. cocos2d-js 苹果 刘海屏 适配
  20. (18) 基于时空多图卷积网络的网约车需求预测

热门文章

  1. 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?
  2. 每日一threeJS(1)
  3. oracle 考试通过说考试作弊,这些行为很有可能会被判定为作弊!一定要小心!...
  4. HC-05蓝牙模块,在AT指令模式时输出AT+NAME?无应答问题
  5. MSCode微服务平台框架基于SpringCloud、SpringCloud Alibaba、SpringBoot和Activiti7工作流,快速开发办公OA、CRM、ERP、电商、信息管理等业务系统
  6. 默认语言及Android平台语言支持状态(印度语)Android N 设置中语言列表介绍
  7. Marple表演电影字幕
  8. 强一致性 弱一致性 最终一致性
  9. 开发一款APP需要多少钱
  10. JavaEE开发环境NetBeans+Glassfish(绿色版),可有效解决NetBeans卡在下一步无法安装等问题。