我刚刚从 Akka 开始,我试图将一些杂乱的功能拆分成更易于管理的部分,每个部分都将由不同的参与者执行。
我的任务似乎完全适合演员模型。我有一个对象树,它们保存在数据库中。每个节点都有一些属性;让我们只专注于一个,称之为财富。孩子的财富取决于父母的财富。当一个人在一个节点上计算财富时,这应该会触发对孩子的类似计算。我想收集所有更新的节点实例并将它们同时保存在数据库中。
这看起来很简单:一个actor只执行计算,然后为当前节点的每个子节点启动另一个actor。当所有子节点都发回一条带有计算结果的消息时,actor 收集它们,添加当前节点并向其上方的 actor 发送一条消息。
问题是我不知道一种方法来确保一个人已经收到了所有孩子的消息。一个简单的方法是使用计数器并在孩子收到消息时增加它。
但是,如果系统的两个独立部分需要执行这样的计算并且重用同一个参与者,会发生什么?演员将产生两倍的孩子,计数将不再可靠。我需要的是确保不会从外部系统重用同一个actor,但是每次触发计算时都会生成新的actor。
这甚至可能吗?如果没有,Akka 中是否有一些自动机制来确保每个孩子都完成了任务?
我只是在不适合这里的情况下使用演员模型吗?本质上,我所做的只是函数可以做的——参与者本身是无状态的,但它们允许我简化和并行化计算。