文章目录 容错 依赖 简介 实践中的故障处理 创建监督策略 默认监督策略 停止监督策略 记录 Actor 的失败 顶级 Actor 的监督者 测试应用 容错 依赖 容错(fault tolerance...在上面的示例中,10和Duration.create(1, TimeUnit.MINUTES)分别传递给maxNrOfRetries和withinTimeRange参数,这意味着策略每分钟重新启动一个子级最多...如果你指定: -1到maxNrOfRetries,Duration.Inf()到withinTimeRange 总是无限制地重新启动子级 -1到maxNrOfRetries,有限的Duration到withinTimeRange...默认监督策略 如果定义的策略不包括引发的异常,则使用升级(escalate)。...因为重启时的默认指令是杀死所有的子级,所以我们不希望子级在这次失败中幸存。 如果不需要这样做(这取决于用例),我们需要使用一个不同的监督者来覆盖这个行为。
把它当作所有下属子级同时发生了相同异常,对所有子级Actor施用策略 下面是一个典型的策略例子: OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange...以下是Akka提供的默认策略: /** * When supervisorStrategy is not specified for an actor this * `Decider` is...当然我们可以在这个默认策略之上再添加自定义的一些异常处理策略: override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries...} override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5...} override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5
Router-Group模式中的Routees由外界其它Actor产生,特点是能实现灵活的Routee构建和监控,可以用不同的监管策略来管理一个Router下的Routees,比如可以使用BackoffSupervisor...在上面修改后的代码里增加了监管策略SupervisorStrategy的使用测试。Router的默认监管策略是Esculate,即把某个Routee发生的异常提交给Router的直属父级处理。...所以必须人为的设定Router监管策略。...OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds)( routingDecider.orElse(SupervisorStrategy.defaultDecider...OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds)( routingDecider.orElse(SupervisorStrategy.defaultDecider
当时我们把BackoffSupervisor作为父子监管方式的其中一种。实际上BackoffSupervisor与定义了supervisorStrategy的Actor有所不同。...监管策略(SupervisorStrategy)是在BackoffSupervisor的内部实现的。...second, 5 seconds, 0.0) .withManualReset .withSupervisorStrategy( OneForOneStrategy(maxNrOfRetries...在构建上面例子里的Supervisor的Props时定义了监管策略(SupervisorStrategy)对InnerChild产生的异常ChildException进行Restart处理。...下面我们来解决失踪消息的问题:首先是如何重新发送造成异常的消息,我们可以在监管策略中重启前发送: def decider: PartialFunction[Throwable, SupervisorStrategy.Directive
calculator: ${reason.getMessage}") super.preRestart(reason, message) } } 由于ArithmeticException默认的处理策略...我们可以在remote上加一个Supervisor来把异常处理策略改为Resume。...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){
] = { case _: ArithmeticException => SupervisorStrategy.Resume } override def supervisorStrategy...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){
] = { case _: ArithmeticException => SupervisorStrategy.Resume } override def supervisorStrategy...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...但是,要注意actorOf的name必须与配置文档中的设置匹配。 试运行结果与上一个例子相同。值得注意的是实际远程构建的是一个SupervisorActor。...] = { case _: ArithmeticException => SupervisorStrategy.Resume } override def supervisorStrategy...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){
这也意味着守护者的监管策略决定了顶级(top-level)正常 Actor 的监督方式。.../: The Root Guardian,根守护者是所有所谓的“顶级(top-level)” Actor 的祖父(grand-parent)级,并使用SupervisorStrategy.stoppingStrategy...它还使用默认的停止策略,任何异常都会导致子 Actor 停止。...One-For-One 策略 vs. All-For-One 策略 Akka 提供了两种监管策略:一种是OneForOneStrategy,另一种是AllForOneStrategy。...在All-For-One策略中,通常停止一个子级将不会自动终止其他子级;通过监控他们的生命周期可以完成:如果监督者不处理Terminated消息,它将抛出DeathPactException(这取决于它的监督者
在我们这次的测试里只能使用group类型的Router,因为如果需要对routee实现监管supervision的话,pool类型的router在routee终止时会自动补充构建新的routee,如此就避开了监管策略...既然是模拟数据库的并行存写动作,我们可以试着为每个routee增加逐步延时重启策略BackOffSupervisor: object StorageActor { case class Query...super.preStart() } } def props = Props(new StorageActor) } object StorageActorGuardian { //带监管策略的...super.preStart() } } def props = Props(new StorageActor) } object StorageActorGuardian { //带监管策略的...super.preStart() } } def props = Props(new StorageActor) } object StorageActorGuardian { //带监管策略的
] = { case _: ArithmeticException => SupervisorStrategy.Resume } override def supervisorStrategy...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){...CalcSupervisor是Calculator的监管,这样做是为了实现新的监管策略SupervisorStrategy。...] = { case _: ArithmeticException => SupervisorStrategy.Resume } override def supervisorStrategy...: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 5, withinTimeRange = 5 seconds){
细分的任务相互之间可以有关联或者各自为独立运算,使用akka-cluster可以把任务按照各节点运算资源的负载情况进行均匀的分配,从而达到资源的合理充分利用以实现运算效率最大化的目的。...由于承担运算任务的目标actor具体的部署位置是由算法决定的,所以我们一般不需要控制指定的actor或者读取它的内部状态。当然,如果需要的话我们还是可以通过嵌入消息的方式来实现这样的功能。 ...,采用SupervisorStrategy异常处理方式。...log.info(s"Child received message: ${msg}") } } object Supervisor { def props: Props = { //在这里定义了监管策略和...下面是具体的数据库存储操作示范: def superProps: Props = { def decider: PartialFunction[Throwable, SupervisorStrategy.Directive
,但是所有独立于角色的节点都可以不指定withRole来使用。...集群单例管理器 Actor 不应该改变其监视策略,因为它应该一直在运行。但是,有时添加对用户 Actor 的监督是有用的。...supervisorStrategy; final ActorRef child; SupervisorActor(Props childProps, SupervisorStrategy...supervisorStrategy) { this.childProps = childProps; this.supervisorStrategy = supervisorStrategy...supervisorStrategy() { return supervisorStrategy; } @Override public Receive createReceive
也就是说增加了一种专门负责EventSource模式的actor, 最终和其它种类的actor一道可以完美实现CQRS。...新的actor,我还是把它称为persistentActor,还是一种能维护和维持运行状态的actor。...当然作为一种具备EventSourcedBehavior的actor, 普遍应有的actor属性、方法、消息处理协议、监管什么的都还必须存在。...:这个策略只适用于onPersistFailure(),从外部用Behaviors.supervisor()包嵌是无法实现处理PersistFailure效果的。...在操作失败后需要某种Backoff重启策略。
如何实现“使用而不耦合” 1. 抽象层的使用 实现“使用而不耦合”的一个关键策略是引入抽象层。...设计模式的应用 使用设计模式如工厂模式、策略模式或适配器模式可以减少应用程序与特定框架的直接交互。这样的模式提供了一种方法,使得更换框架或对框架进行重大更改时,对应用程序的影响最小化。 3....挑战与解决方案 尽管“使用而不耦合”的理念在理论上具有吸引力,但在实践中却面临诸多挑战: 性能权衡:引入额外的抽象层可能会带来性能开销。 复杂性增加:过度设计可能导致系统变得不必要地复杂。...学习曲线:开发者需要掌握额外的设计模式和原则。 为了克服这些挑战,重要的是要平衡使用框架带来的便利性和保持灵活性之间的关系。...结论 “你可以使用框架,但不要与它耦合”是一种理想的软件开发原则,它强调了在利用框架提供的便利的同时,保持应用程序的灵活性和可维护性。
决定分片位置的逻辑在可插拔分片分配策略中定义。...此策略可以由特定于应用程序的实现替代。...这种成本随着每个分片的实体数量增加而增加,我们目前不建议在每个分片上使用超过 10000 个实体。...监督 如果需要为实体 Actor 使用其他supervisorStrategy,而不是默认(重新启动)策略,则需要创建一个中间父 Actor,该 Actor 定义子实体 Actor 的supervisorStrategy...有关如何实现自定义分片分配策略的详细信息,请参阅AbstractShardAllocationStrategy的 API 文档。
Akka 的容错机制是基于层次结构: Akka 在 Actor 加一个监控策略,对其子 Actor 进行监控。...override val supervisorStrategy = OneForOneStrategy(){ case _:Exception => Stop } Akka 的监控策略一共支持四种动作...Akka 的监控策略分为两种。一种是 OneForOne。这种策略只对抛出 Exception 的子 Actor 执行相应动作。...还是拿上面的翻译模块做例子,我们加入一个 OneForOne 的 Stop 的监控策略。...这个结果说明监控策略已经将 MasterActor 的所有子 Actor 停止了。 3. 总结 我们使用 Akka 开发并行程序时,可以使用层级结构组织 Actors。
class Supervise[T] private[akka] (val wrapped: Behavior[T]) extends AnyVal { /** Specify the [[SupervisorStrategy...那么我可以把HelloActor的功能再完善点,加个监管策略SupervisorStrategy: object HelloActor { sealed trait Request...Behaviors.same } ).onFailure(SupervisorStrategy.restartWithBackoff(10.seconds, 1.minute...再就是增加了BackOff-SupervisorStrategy,不需要独立的BackOffSupervisor actor了。...Behaviors.same } ).onFailure(SupervisorStrategy.restartWithBackoff(10.seconds, 1.minute
重磅 Chat 《 高效学习,快速变现:不走弯路的五大学习策略》 分享人: Seaborn Lee,一名会在 B 站直播写代码,会玩杂耍球、弹 Ukulele、极限健身、跑步、写段子、画画、翻译、写作、...演讲、培训的程序员。...喜欢用编程实现自己的想法,在 Android 市场上赚过钱,有多次创业经历。 擅长学习,习惯养成,时间管理。身体力行地影响他人做出积极的改变!...目前就职于 ThoughtWorks,致力于传播快乐高效的编程理念。业余创立软件匠艺社区 CodingStyle.cn,组织超过30场技术活动。...找不到使用场景 效率低,学习速度跟不上知识产生的速度 记不牢,学习速度赶不上遗忘速度 在这个知识泛滥、跨界竞争的年代,学习能力才是核心竞争力。
,并在集群指标扩展的帮助下将其发布到其他集群节点和系统事件总线上注册的订阅者。...,用户提供的指标收集器和内置的指标收集器都可以选择使用Hyperic Sigar来获取更广泛、更准确的指标范围。...它使用随机选择的路由,概率来自于相应节点的剩余容量。...strategy { # # FQCN of class providing `akka.actor.SupervisorStrategy`....maxNrOfRetries = 3 } } } # Metrics collector actor.
此时应进行下面的处理: 1)增加单号 2)清除所有交易项目 3)saveSnapshot (重启就不用恢复前面的事件persistent-events) 7、资源释放策略及处理 passivation...minBackoff = 1.seconds, maxBackoff = 30.seconds, randomFactor = 0.2, maxNrOfRetries...Msg(10, "hello") expectMsgType[Response](20.seconds) } } } 8、异常处理、重试策略 backoffsupervisor...minBackoff = 1.seconds, maxBackoff = 30.seconds, randomFactor = 0.2, maxNrOfRetries...11、设计一套POS前端的命名规则:因为有关POS过程的事件持久化是以persistenceId辨别的,所以一个POS编号应该有一个对应的persistenceId,所有这个POS编号的事件都以对应的
领取专属 10元无门槛券
手把手带您无忧上云