3

我刚刚从 Akka 开始,我试图将一些杂乱的功能拆分成更易于管理的部分,每个部分都将由不同的参与者执行。

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

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

问题是我不知道一种方法来确保一个人已经收到了所有孩子的消息。一个简单的方法是使用计数器并在孩子收到消息时增加它。

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

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

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

4

1 回答 1

3

您描述事物的方式,我认为您真正想要的是一个返回 Future[Tree[NodeWealth]] 的递归函数,该函数每次被调用时都会产生一个 Future,并且它会为层次结构中的每个子级调用自身,在函数结束时,它将来自这些调用的 Futures 组合成单个 Future[Result]。当递归函数终止并返回 Future[Tree[NodeWealth]] 时,您可以将其与另一个更新您的数据库的 Future 组合。在 Futures 上查看 Akka 文档。并特别注意“组成期货”部分。

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

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

于 2012-10-10T16:50:52.533 回答