问题标签 [akka-supervision]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 监护人演员中的 Akka AllForOne 主管策略
我需要一种方法来停止一个actorSystem中的所有演员,因为其中一个演员出现某些异常。我的想法是更改 Guardian Actor 的默认策略,为收到的每个异常设置一个带有 SupervisorStrategy.stop 的 AllForOneStrategy。
问题是即使在参与者失败时正确加载了 application.conf,系统仍然运行。
这是定义主管策略的类
这是生成所有其他可能失败的 Actor 的 Actor。如您所见,它的一个子 Actor 是否会抛出 AskTimeoutException 它 Escalade() 以便到达监护 Actor。
akka - 在开路断路器上选择合适的参与者监督策略
Akka 监督策略允许自定义行为,具体取决于它抛出的异常类型,因此监督者可以选择是否应该停止、重新启动、恢复失败的 Actor 或将错误升级到其父级。当演员因 CircuitBreakerOpenException 失败并且需要重新启动演员时,我正在尝试构建自定义主管策略。如果我只选择重新启动策略,actor 将立即重新启动,这是没有意义的,因为它会在 resetTimeout 间隔内立即再次失败。所以正确的行为是等待 XXX 秒,然后使用 Restart 指令。但这种行为不能用演员监督策略来表达。
实施这种行为的正确方法是什么?我当然可以在子actor实现中添加一个try/catch句柄,但这违背了actor监督的概念。
kotlin - BackoffSupervisor 可以有多个子actor吗?
我所有的演员都继承自BaseActor
并可以创建子演员registerActor()
当一个演员/user/dad
创建 2 个子演员时,registerActor()
但是创建了 2 个主管
如何重用同一个主管来监督foo
和bar
?
akka - 是否可以在 Akka Clustering 中定义多个停止消息
我正在尝试为集群分片配置 Akka Actor,我不太确定的一件事是,是否可以为实体配置多个停止消息以进行正常关闭。
例如,如下所示的实体配置将触发“onDelete”和“onExit”的正常关闭,或者它只会为“onExit”执行此操作?
如果没有,您是否知道我如何实现这种行为?
谢谢解答
scala - Akka Actors Supervision - “恢复”是否保留当前消息?
在 Akka Actors(使用 Scala)中,可以使用监督策略来处理异常。这个策略可以根据异常的类型来决定对actor做什么。根据我的理解,有4种可能的结果:
- Resume - 让子actor保持其当前状态并继续处理新消息,就像什么都没发生一样。
- Restart - 重新启动子actor,即杀死当前失败的子actor并在其位置创建一个新子actor。
- 停止- 永久关闭子演员。
- 升级- 让主管的主管处理此错误。
文档清楚地指出,在重新启动参与者时,当前消息将丢失,必须进行处理。但是,它没有明确提及是否同样适用于简历。它是否继续处理该消息(假设某些外部因素导致不再存在的异常),还是继续处理邮箱中的下一条消息?
scala - akka 演员监督策略不适用于使用 ActorRefFactory 创建的子演员
我正在通过ActorRefFactory创建子演员,以便我可以注入它 我正在为这些儿童演员使用一对一的监督策略,但是当他们抛出异常时,我无法在日志中看到监督 startegy 正在按照我的设置工作它到Resume
这是我的代码
ActorManager.scala //父演员
儿童演员
服务等级
存储库类
领域类
我正在添加一个具有相同密钥的文档,以便代码抛出 MongoDublicateKey 异常,我可以测试代码,但这里是我得到的日志,它没有显示演员中的主管演员
java - 这是 Akka 角色的正确用例吗?
我正在更新一个 Akka 集群,其中特定参与者应该根据配置值在集群内的节点上启动。最初,我考虑使用自定义 Akka 集群角色并做了一些研究,阅读https://doc.akka.io/docs/akka/current/cluster-usage.html
提供此代码:
根据角色启动一个演员似乎不是 Akka 经典中角色的预期功能,因为在上面的示例中,演员没有被创建。而是根据路径将消息传递给另一个参与者。由于 Akka 经典中没有 spawn 方法,所以 Akka 经典中无法实现基于角色创建演员?
为角色键入的 Akka 似乎实现了我正在尝试实现的预期功能:
来自https://doc.akka.io/docs/akka/current/typed/cluster.html:
如果角色可用,这里会创建一个 Akka 角色。
当我使用经典 Actors 时,我正在考虑为 .yml 文件中的每个部署添加一个环境变量而不是 Akka“角色”,然后在启动所有 Akka Actor 的源代码中(如果为给定填充了环境变量)部署启动给定的actor,否则不启动actor。这是确定应该在集群中的每个节点上启动哪个参与者的可行解决方案吗?
java - 如何在 Akka 集群中指定节点级别的角色?
给定以下 application.conf :
为了辨别演员中的角色,我使用:
从 src ( https://doc.akka.io/docs/akka/current/cluster-usage.html )编辑
要为节点启用角色,我使用以下配置:
在 application.conf 中,我为角色配置了数组,但这似乎是在集群级别而不是节点级别。换句话说,似乎不可能配置 application.conf 以指示 Akka 集群在节点 n1 上启动 actor a1 并在节点 n2 上启动 actor a2?是否应在 application.conf 中的 akka.cluster 级别指定注释详细信息?
对于每个节点,是否需要指定多个 application.conf 配置文件?
例如,testrole1 的 application.conf
testrole2 的 application.conf :
上面定义的每个 application.conf 之间的区别在于 的值为akka.cluster.roles
"testrole1"
或"testrole2"
.
应该如何配置 application.conf 以便指示 Akka 集群在节点 n1 上启动 actor a1 并在节点 n2 上启动 actor a2?是否应该在 application.conf 中的 akka.cluster 级别指定节点详细信息?
更新:
另一种选择是通过环境变量传递角色名称?我刚刚注意到这里明确说明了这一点:https://doc.akka.io/docs/akka/current/typed/cluster.html “节点角色在名为 akka.cluster.roles 的配置属性中定义,通常在启动脚本中定义为系统属性或环境变量。” 在这种情况下,对所有节点使用相同的 application.conf 文件,但每个节点都使用一个环境变量。例如,更新的 appliction.conf(注意添加“ENV_VARIABLE”)
集群启动脚本通过参数确定每个节点的角色ENV_VARIABLE
,这是一个可行的解决方案吗?
scala - 如何在 Akka 中监督 actor 并处理异常
我正在尝试改进系统中参与者的错误处理。有时,在处理数据时,出现问题,我需要停止并重新启动actor,并记录有关此故障的一些信息。
我有一个主管,有 5 个演员为它工作。所以我需要能够监督他们所有人。我找到了这个链接:
https://doc.akka.io/docs/akka/current/typed/fault-tolerance.html
关于这一点,但我认为在哪里实现代码并不是很清楚:
Behaviors.supervise(behavior).onFailure[IllegalStateException](SupervisorStrategy.restart)
这段代码到底应该去哪里?
谢谢
scala - Scala Akka 容错/监督不起作用
我正在尝试在我的 Scala 项目的演员系统中实现容错,以识别错误并处理它们。我正在使用经典演员。每个主管 Actor 有 5 个子 Actor,如果其中一个子 Actor 失败,我想重新启动该 Actor,并记录错误,正如我所提到的,处理导致该 Actor 失败的问题。
我One-For-One SupervisorStrategy
在我的主管演员类中实现了一个:
我添加了throw new NullPointerException
一个我知道在每个参与者中调用的方法之一,因为系统从不/很少失败。但是,在log
文件中,我没有得到我所期望的,而是以下内容:
我已经查看了很多示例,以及 Akka 文档中关于类型和经典角色的容错性,但我无法让它发挥作用。
编辑
在做了更多的研究之后,我发现我得到的错误的潜在原因可能是由子actor中的无限循环引起的,它抛出错误、重新启动、抛出错误等。
所以我采取了一种不同的方法,在主管actor中,我添加了一个变量sentError = false
,然后在一个告诉子actor开始工作的主管方法中,我添加了以下内容:
当一个子actor收到错误时,他们会抛出它。我采用了这种方法,这样这种情况只会发生一次,以避免循环。但是,不幸的是这并没有改变输出,我仍然得到上面提到的错误。