问题标签 [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 演员/主管层次结构?
我是 Akka 的新手(Java lib,v2.3.9)。我正在尝试遵循主管层次结构的最佳实践,但由于这是我的第一个 Akka 应用程序,因此在某个地方遇到了心理障碍。
在我的第一个 Akka 应用程序(实际上是一个旨在跨多个应用程序重用的库)中,来自外部世界的输入表现Process
为传递给参与者的消息。使用我的应用程序的开发人员将提供一个基于文本的配置文件,该文件最终配置哪些参与者会收到发送的Process
实例,哪些不会。换句话说,假设这些是我的演员课程:
正如您在配置文件中看到的那样,只有StormTrooper
和Emperor
被选中来接收Process
消息。这最终导致创建零 (0)DarthVader
个参与者。我的意图也是,这将导致对Set<ActorRef>
填充的应用程序可用,StormTrooper
如下Emperor
所示:
因此,正如您(希望)看到的那样,我们拥有所有这些参与者(实际上,有几十个UntypedActor
impl)来处理Process
消息(这些消息Input
又从某个来源捕获)。至于哪些 Actor 还活着/在线来处理这些Process
消息完全是配置驱动的。最后,每次应用程序收到一个Input
,它都会被注入到一条Process
消息中,并且该Process
消息会发送给所有已配置/正在运行的参与者。
有了这个作为给定的背景故事/设置,我无法确定“演员/主管层次结构”需要是什么。在我的用例中,似乎所有参与者都是真正平等的,他们之间没有监督结构。如果该类型的参与者被配置为存在,则StormTrooper
只会收到一条消息。Process
其他演员子类也是如此。
我在这里完全错过了什么吗?如果所有参与者都是平等的并且层次结构本质上是“扁平”/水平的,我如何定义监督层次结构(出于容错目的)?
java - Akka:测试主管建议
我对我的系统编程很陌生Akka
并且习惯于Java
编程。
问题定义
- 我有一个TenantMonitor
在接收TenantMonitorMessage()
时启动一个新角色的方法DiskMonitorActor
。
-DiskMonitorActor
可能因各种原因失败并可能抛出DiskException
. DiskMonitorActor
已经过单元测试 。
我需要的?
- 我想测试行为TenantMonitorActor
,这样当DiskException
发生时,它会采取正确的行动,比如stop()
,resume()
或任何(取决于我的应用程序可能需要什么)
我试过什么?
根据文档,我可以执行的最接近的是名为Expecting Log Messages的部分。
我在哪里需要帮助?
- 虽然我理解期望正确的错误日志很重要,但它只是断言第一部分,该异常被抛出并被正确记录,但无助于断言正确strategy
被调用
代码?
TenantMonitorActor
测试
更新
我能写的最好的方法是确保DiskMonitor
一旦发生异常就停止
有没有更好的方法?
scala - 如何在 Akka 中获取 RouterPool 的所有子项的 ActorRefs
我创建了一个这样的actor的RouterPool:
现在我想访问由这个路由器管理的 5 个孩子的 ActorRef 对象。是否有一些方法调用来为所有孩子检索它?还是我必须明确声明它们然后将它们传递给路由器?
akka - 将 ActorRef 作为构造函数参数传递
我是 Akka 的新手,我正在构建一个包含许多远程节点的集群系统。远程节点称为工人。工作人员创建远程路由器链。
创建路由器的父级(工人)将有一个统计观察者,该观察者将从路由器的所有路由中获取消息。
qn is : Is 在创建路由器时传递 statswatcher actorRef 作为路由器的构造函数参数或者只是传递 statswatcher 的actor路径作为构造函数参数和路由器中的用户actor选择来告诉消息是一种很好的做法。
**************** 更新 ********
根据来自 akka 邮件组的回复,将 actor ref 作为构造函数参数的回复并不是一个坏习惯。演员选择对于远程演员查找很有用。
akka - 针对不同类型演员的 Akka 主管策略
我正在使用 Akka,我想为 User Guardian 演员定义我自己的监督策略。我定义了两种类型的actor,称为TaskActor 和MessageActor。它们被实例化为顶级演员。我希望用户监护人应用以下监督策略:当他们抛出异常时停止 TaskActor 并恢复 MessageActor(我不介意抛出什么特定类型的异常)。我该怎么做?
scala - 一旦 Actor 重新启动,如何从 Supervisor 向 Actor 发送消息?
要求?
- 必须有一个长时间运行的进程(守护进程)应该永远运行
- 如果出现任何异常,应该重新启动它,但如果它再次失败两次,则不应重新启动
我面临的问题?
- 演员重新启动,但没有再次发送消息
我有的?
主班
导师
演员
实际工作
日志
更新
如果我不委托给Future
,即使在重新启动的情况下,一切都会按预期工作,但是当委托给 时Future
,Future
在 actor 的情况下不会执行restart
。看这里
java - 设计 Akka 主管层次结构
请注意:我是一名 Java 开发人员,没有 Scala 的工作知识(很遗憾)。我会要求答案中提供的任何代码示例都将使用 Akka 的 Java API。
我对 Akka 和演员来说是全新的,并且正在尝试建立一个相当简单的演员系统:
因此,DataSplitter
actor 运行并将相当大的二进制数据块(例如 20GB)拆分为 100 KB 的块。对于每个块,数据都存储在DataCache
通过DataCacher
. 在后台,aDataCacheCleaner
翻阅缓存并找到可以安全删除的数据块。这就是我们防止缓存变为 20GB 大小的方法。
在将块发送到DataCacher
缓存后,DataSplitter
然后通知ProcessorPool
现在需要处理的块。这ProcessorPool
是一个路由器/池,由数万个不同的ProcessorActors
. 当每个ProcessActor
人收到“处理”100KB 数据块的通知时,它就会从 中获取数据DataCacher
并对其进行一些处理。
如果你想知道我为什么还要在这里缓存任何东西(因此是DataCacher
,DataCache
和DataCacheCleaner
),我的想法是 100KB 仍然是一个相当大的消息,可以传递给数以万计的 Actor 实例(100KB * 1,000 = 100MB),所以我试图只存储一次 100KB 块(在缓存中),然后让每个参与者通过缓存 API 引用来访问它。
还有一个Mailman
actor 订阅事件总线并拦截所有DeadLetters
.
因此,总共有 6 个演员:
DataSplitter
DataCacher
DataCacheCleaner
ProcessorPool
ProcessorActor
Mailman
Akka 文档宣扬您应该基于划分子任务而不是纯粹按功能分解您的参与者系统,但我并没有完全了解这在此处是如何应用的。手头的问题是我正在尝试在这些参与者之间组织一个主管层次结构,我不确定最好/正确的方法是什么。显然ProcessorPool
是一个需要成为 的父/主管的路由器ProcessorActors
,所以我们有这个已知的层次结构:
但除了那种已知/明显的关系,我不知道如何组织我的其他演员。我可以让他们在一个共同/主要演员下成为“同行”:
或者我可以省略一个master
(根)actor并尝试使缓存周围的东西更加垂直:
对 Akka 如此陌生,我只是不确定最好的行动方案是什么,如果有人可以在这里提供一些初步的帮助,我相信灯泡都会打开。而且,与组织这个层次结构同样重要的是,我什至不确定我可以使用哪些 API 构造来实际在代码中创建层次结构。
java - Akka SupervisorStrategies 与孩子的关系
Java API 在这里。我试图了解 Akka 演员监督的真正运作方式,特别是监督策略。对我来说,该策略感觉就像(本质上)将异常映射到指令。
我刚刚阅读了官方的Akka Fault Tolerance 文档,但在该文档中实际上并没有明确说明何时/何地/如何触发监督策略。
所以我问:什么时候采用监督策略?当子actorThrowable
从其onReceive
方法中抛出一个?还是有什么不同?
akka - 回退的 Akka 和主管策略
我是 Akka 的新手,但我对该指令的理解是,当孩子应该被视为永久停止服务时,它会在内部使用,但有一种方法可以处理完全中断。Stop
SupervisorStrategies
如果这种理解是正确的,那么我想做的是在正常/主要孩子停止后使用某种“备用演员”,并从那时起将其用作后备。例如,假设我有一个父演员,他有一个子演员——Notifier
他的工作是发送电子邮件。如果Notifier
真的死了(比如,底层邮件服务器离线),这个actor的备份可能是另一个actor,比如,QueueClient
它将通知请求发送到消息代理,消息将被排队并稍后重播时间。
我如何定义这样一个SupervisorStrategy
内置的容错/演员备份?请显示代码示例,这是我学习的唯一方法!
java - 如何升级 Akka 中的最高主管?
我有以下顶级(“最父母”)演员:
如您所见,它监督三个孩子,当这三个孩子抛出“可恢复”异常时,它们将被停止并替换为备份。到目前为止,一切都很好。
我现在面临的问题是,如果备用演员抛出任何可抛出的东西,我想考虑这个Master
演员(实际上,我的应用程序)处于无法继续处理任何输入的状态,并升级监护人级别的例外。
我是 Akka 的新手,不知道把这段代码放在哪里,以及它应该是什么样子。同样,我只需要这样说的逻辑:
- 如果备份 actor 抛出任何 throwable,将异常升级到
Master
的父级,它应该是 Akka “<a href="http://doc.akka.io/docs/akka/snapshot/general/supervision.html " rel="nofollow">guaradian 演员/构造
第一部分是我们需要知道何时从备份中抛出异常;我可以处理这部分,所以让我们假设我们的策略现在看起来像这样:
但正如你所看到的,我仍在努力实现“脱离参与者系统”的升级。想法?Java 代码示例非常受欢迎,因为 Scala 在我看来就像象形文字。