Concurrency FSM是我的基于Akka Actor的异步计算引擎的正确解决方案吗

Concurrency FSM是我的基于Akka Actor的异步计算引擎的正确解决方案吗,concurrency,actor,akka,fsm,Concurrency,Actor,Akka,Fsm,我正在编写一个计算引擎(作为Akka Actors实现),它将使用一些异步和并发Actor来执行一些数据检索以及计算的某些部分 当主参与者收到启动计算的消息时,它必须在执行计算之前从数据库中检索三条不同的数据。为了进行数据检索,我准备了3个参与者,每个参与者负责一次数据检索 在进入下一步之前,我需要所有三个数据集。然而,由于它们是异步并发检索的,所以我无法知道将首先返回哪一个 我的第一反应是在我的主要参与者中为每个进程维护一个标志(布尔值)。当每个子参与者发回数据集时,我的主参与者中的相应标志被

我正在编写一个计算引擎(作为Akka Actors实现),它将使用一些异步和并发Actor来执行一些数据检索以及计算的某些部分

当主参与者收到启动计算的消息时,它必须在执行计算之前从数据库中检索三条不同的数据。为了进行数据检索,我准备了3个参与者,每个参与者负责一次数据检索

在进入下一步之前,我需要所有三个数据集。然而,由于它们是异步并发检索的,所以我无法知道将首先返回哪一个

我的第一反应是在我的主要参与者中为每个进程维护一个标志(布尔值)。当每个子参与者发回数据集时,我的主参与者中的相应标志被设置为true,并检查其他两个标志是否准备好继续

随着我对FSM的更多了解,我相信我所做的事情可能会适合我。然而,我的一些“状态”可能同时存在。例如,“WaitingForData1”、“WaitingForData2”和“WaitingForData3”状态可以/将同时存在。在FSM中,这似乎不是正确的做法。另一种方法是为其他状态的每个渗透创建一个状态。例如:

  • 状态1:等待数据1、数据2和数据3
  • 状态2:数据1就绪,正在等待数据2和数据3
  • 状态3:数据2就绪,正在等待数据1和数据3
  • 状态4:数据3就绪,正在等待数据1和数据2
  • 状态5:数据1和数据2准备就绪,等待数据3
  • 状态N:数据1、数据2和数据3准备就绪
对于我正在做的事情来说,这似乎有点过分,但实际上可能是实现使用异步和并发进程的FSM的最佳方法


非常感谢您的FSM专家提供的任何建议。

由于主要参与者似乎不关心数据集的完成顺序,我认为最多应该有以下状态:“等待3个数据集”、“等待2个数据集”、“等待1个数据集”、“所有数据集准备就绪”“。我不熟悉Akka,所以我要说的可能不适用,但如果我在C中这样做,我只会有一个“等待数据集准备就绪”状态,它统计完成事件(但不会更改为新状态),当它们都准备就绪时,移动到对它们起作用的状态。抱歉,这不是一个完整的答案(从字面意义上讲):当前FSM实现中唯一缺少的是对嵌套状态机的支持。然后,您可以让其中三个处理这三个查询,并让整个机器响应这三个查询都达到最终状态的事件。对于有一点空闲时间的人来说,这将是一个不错的项目……这个问题很老,然而,我在查找FSM信息时偶然发现了它。在这种情况下,您正在进行3个不相关的数据库调用,没有特定的顺序或序列,可能更简单地使用一个参与者作为关联点,并使用futures执行查询。然后将每个响应折叠到一个公共类中,或者根据正在处理的futures列表执行essed,将结果反馈给参与者,并将任何计算作为事件后数据检索来处理。FSM对于上述场景可能有点过分。