无国籍的Akka演员

时间:2012-10-09 16:39:46

标签: scala akka

我刚刚开始使用Akka,我试图将一些混乱的函数分成更易于处理的部分,每个部分都由不同的演员执行。

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

这看起来很简单:一个actor只执行计算,然后为当前节点的每个子节点启动另一个actor。当所有孩子发回带有计算结果的消息时,演员收集它们,添加当前节点并向他上方的演员发送消息。

问题在于我不知道如何确保收到所有孩子的留言。一个微不足道的方法是使用一个计数器,并在孩子的消息到达时增加它。

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

  

这甚至可能吗?如果没有,Akka中是否有一些自动机制可以确保每个孩子都完成了它的任务?

我是否只是在不适合的情况下使用演员模型?基本上我只做功能 - 演员本身是无状态的,但它们允许我简化和并行化计算。

1 个答案:

答案 0 :(得分:3)

你描述事物的方式,我认为你真正想要的是一个返回Future [Tree [NodeWealth]]的递归函数,该函数每次调用时都会产生一个Future,它会为每个孩子调用自己在层次结构中,在函数结束时,它会将Futures从那些调用组成单个Future [Result]。当递归函数终止并返回Future [Tree [NodeWealth]]时,您可以将其与另一个更新数据库的Future组合。看一下Akka文档here on Futures。并特别注意“撰写期货”一节。

期货的构成应该允许您避免状态并轻松实现。

另一个选择是使用演员和期货,并在子演员身上使用询问模式,将结果期货组合成一个单一的未来,然后返回给发件人(父演员)。这基本上是同一件事,只是与演员交织在一起。如果你因为某些其他原因已经把你的节点表示为演员,我可能只会走这条路。