我应该保留儿童演员的注册表吗?

时间:2018-01-11 10:36:32

标签: akka.net actor-model

我最近开始研究一个系统,我正在使用Akka.NET。我仍在学习如何用演员模型来思考,所以我愿意接受更有经验的人的建议。

我首先尝试提出一个更普遍的问题:

如果决策必须基于分布的众多参数和复杂业务规则,如何通过管理者实体跟踪子actor的状态,以便决定与哪个子项进行交互在多个演员类中。

我会尝试简化我面临的问题: 假设我有一个Actor系统,并且有一个名为 Backlog 的演员。

积压负责创建和监督职位(也是演员)。

作业具有生命周期,为简单起见,它们可以是活动已完成。它们被创建为活动,并在收到特定消息时变为已完成。完成并不意味着终止。那是后来的某个时刻(所以没有死亡计)。 作业可以并最终与资源相关联。一个作业可能与零个,一个或多个资源相关联。

资源 Backlog 未受监督的演员。 资源的数量有限。

任何时候都只能将一个活动作业与资源相关联。

资源可能与作业无关。 资源可能无法识别与作业相关联。

传感器有时检测到 资源 检测器需要知道资源意图意图作业的可变状态的一部分。

资源仅在与作业相关联时才有意图,但它需要声明<当被问及时,他们需要意图,因此需要确保关联作业。 (因为检测器检测到资源,而不是工作。)

在我的设计中,资源需要询问积压以获取作业,如果它在检测到时没有。

现在积压可能有或没有此资源的作业。如果没有,它应该创建一个(让我们说它知道如何)。为了做到这一点,它需要知道哪些作业是活跃的,以及其中任何一个是否已经与正在询问的资源相关联。

还在我身边吗?

那么我应该如何让积压找出资源R 作业?我是否应该向所有工作演员广播一条消息并询问他们是否有效?如果他们不小心处理 R ?我如何确保所有作业确实实际处理它以及我应该等待它们做多少(特别是因为0 ms似乎是这些简单任务唯一可接受的性能)。

或者我应该通过资源标识符保持字典持有作业演员引用?还有(最后已知的)参与这一决定的国家?然后我该如何维护这些词典呢?寻找域名活动?或者为工作引入更多消息,通过至少一次保证告诉积压他们的状态变化?

老实说,我喜欢使用actor模型的心态和好处,但是这里需要大量的代码来实现像传统OO中的单行LINQ查询一样的功能让我担心如何愿意团队的其他成员来处理这段代码。

总结

我有一个演员 Backlog ,负责创建和监督 Jobs ,其他代表域中概念的角色。在某些情况下,它需要根据涉及子actor的可变状态的某些标准选择这些作业中的一个,或者确定当前是否没有可用的作业。 (有多个合适的工作表明存在问题,应予以检测。)

问题我是否有除了向所有工作广播某些信息以外的其他信息,包含标准并等待每个工作将这些标准应用于自己以肯定或否定的答案回应?

1 个答案:

答案 0 :(得分:0)

即使您描述了很多,但缺少一些重要的细节,例如在FIFO处理的积压工作?这对解决方案很重要。

  1. 例如,如果他们这样做,我会使用一些队列,例如RabbitMQ,演员可以在准备就绪时拉出任务,这样积压演员甚至不应该关心,只是将作业分配到适当的队列。
  2. 如果您不关心订单,可以使用路由器并将请求(命令/消息)发送到其中一个| R |。作业参与者,并使用例如最小的队列大小路由策略。
  3. 如果我将回答主要问题,一种方法是将管理器配置为接收更新子状态的命令并在内部更新,这很简单,并且不需要经理人演员中的字典,因为它保证一次执行单个命令。

    对于你所描述的LINQ的关系似乎并不清楚,除非你的问题根本没有找到。