当前位置: 首页 > 知识库问答 >
问题:

无国籍阿卡演员

羊昊苍
2023-03-14

我只是从阿卡开始,我试图将一些混乱的功能分成更容易管理的部分,每个部分都由不同的演员执行。

我的任务似乎正是适合演员模式的。我有一个对象树,它们保存在数据库中。每个节点都有一些属性;让我们只关注一个,称之为财富。孩子的财富取决于父母的财富。当计算节点上的财富时,这应该会在子节点上触发类似的计算。我想收集节点的所有更新实例,并同时将它们保存在数据库中。

这似乎很简单:一个参与者只需执行计算,然后为当前节点的每个子节点启动另一个参与者。当所有子节点发回包含计算结果的消息时,参与者收集它们,添加当前节点,并向其上方的参与者发送消息。

问题是,我不知道有什么方法可以确保一个人收到了所有孩子的信息。一个简单的方法是使用计数器,并在收到来自孩子的消息时增加计数器。

但是,如果系统的两个独立部分需要执行这样的计算,并且重复使用同一个参与者,会发生什么呢?演员将产生两倍的孩子,而且计数将不再可靠。我需要的是确保不从外部系统重用相同的参与者,但每次触发计算时都会生成新的参与者。

这可能吗?如果没有,阿克卡是否有某种自动机制来确保每个孩子都完成了任务?

我只是在不适合这里的情况下使用演员模型吗?从本质上说,我所做的只是函数本身——参与者本身是无状态的,但它们允许我简化和并行计算。

共有1个答案

叶弘深
2023-03-14

你描述事物的方式,我认为你真正想要的是一个递归函数,它返回一个未来[Tree[NodeWalth]],函数每次被调用时都会产生一个未来,它会为层次结构中的每个子级调用自己,在函数的末尾,它会将这些调用的未来组合成一个未来[Result]。当递归函数终止并返回Future[Tree[nodeWalth]]时,您可以将其与另一个Future组合,该Future更新数据库。看看这里关于未来的Akka文档。并特别注意“撰写期货”一节。

期货的组合应该允许你避免这种状态,并且很容易实现。

另一种选择是使用actors和futures,并对子actors使用ask模式,将生成的futures组合成一个futures,然后返回给发送方(父actor)。这本质上是同一件事,只是与演员纠缠在一起。如果您出于其他原因已经将节点表示为参与者,我可能只会走这条路。

 类似资料:
  • 是否有方法获取创建actor的类。例如,我有一个actorRef或actor selection实例,我想从中获取创建现有actor的类。提前感谢您的回复!

  • 我是Akka的新手,我想知道我应该如何处理将工作委托给其他(儿童)演员的演员,但在哪里: 其中一些儿童演员必须按特定顺序参与;和 其中一些子参与者可以以任何顺序参与,并且可以真正地与主/父参与者所做的事情异步执行 假设我有以下儿童演员(不管他们做什么): 假设我有以下调用它们的父参与者: 如你所见: 必须首先“参与”(由家长调用),我们必须等待家长的响应,然后才能继续参与/调用、或 换句话说,当消

  • 我有父母和孩子。每个儿童演员控制一个装置。当我创建所有的子角色时,我给他们一个uuid。 每个子参与者都是通过设备配置创建的,当配置更改时,我希望通过以下方式重新创建参与者: > 停止旧的: 最终的未来停止了=优雅的停止(actorRef,Duration.create(1,时间单位。秒)); Await.result(停止,Duration.create(1, TimeUnit.二)); 重新创

  • 我正在学习如何使用上下文。为了控制我的参与者的状态,我使用以下代码: 当我发送第一条消息时,“接收”工作并打印消息,第二条消息不显示后,这是我的输出: 如果我改变接收方式,为此: 我收到以下输出: 所以我试着跟踪“接收”被“阻止”的时刻,但没有成功,我的疑问是:当我使用上下文时。在《我的演员》中,Akka如何以及何时处理第一次之后的信息?

  • 在主管内部- 以下是我主管课程的一部分: 以下是导致子参与者停止的条件: 在akka工具包中,我可以使用哪个API打印我的Supervisor类中所有子角色的状态?