Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 无国籍阿克卡演员_Scala_Akka - Fatal编程技术网

Scala 无国籍阿克卡演员

Scala 无国籍阿克卡演员,scala,akka,Scala,Akka,我只是从Akka开始,我试图将一些混乱的功能分割成更易于管理的部分,每个部分都将由不同的参与者执行 我的任务似乎正好适合演员模型。我有一个对象树,保存在数据库中。每个节点都有一些属性;让我们只关注其中一个,并称之为财富。孩子的财富取决于父母的财富。当一个人在一个节点上计算财富时,应该会在子节点上触发类似的计算。我想收集节点的所有更新实例,并将它们同时保存在数据库中 这似乎很简单:一个参与者只需执行计算,然后为当前节点的每个子节点启动另一个参与者。当所有子节点发回包含计算结果的消息时,参与者收集它

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

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

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

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

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

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


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

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

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


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

希望同时保存所有更新的节点的原因是什么?此外,树的大致大小是多少?大约有多少个节点?通常有多深?@Larsenal为了保持一致性,我必须在一个事务中保存所有节点。当然,我可以打开一个事务,开始保存节点,然后关闭它。但我更喜欢所有内容都是引用透明的,并且在最后有一个单独的保存操作——除此之外,它更易于测试。关于树的大小,它不会很深,通常只有3层。但它可能相当大。在目前的开发阶段给出硬数据还为时过早,但我预计在第二个级别将有成百上千个节点,每个节点只有少数几个子节点。我也在考虑未来,但我确实不确定以后是否需要更多的参与者功能。我想我现在会选择简单的未来,如果需要的话,我会把未来和演员混合在一起。