akka.net 管理参与者层次结构和 creating/getting 个参与者

akka.net managing actor hiearchy and creating/getting actors

我正在学习 akka,我不确定如何最好地组织,get/create 我的演员们。

现在我有一个像

这样的设置
Department (1000s) can each have many items (10000s) and each item has properties and work that can be done to it

如果我想在部门 3 的项目 C 上执行任务,完成此任务的最佳方法是什么?

我目前已经设置好一切,这样我就必须告诉部门 3 一条消息,然后在部门 3 演员中我会告诉项目 C 演员同样的消息。

我看到的问题是任何时候我想告诉 Item 我必须在 2 个地方(部门和 Item)处理消息。这对我来说感觉不对,但也许那是因为我不理解这种模式。

我也希望这是有状态的,所以我希望演员们坚持下去。这给我带来了另一个挑战。我怎么知道是否加载了部门 3(一旦我有了部门 3,我怎么知道是否有一个已初始化的项目 B 的演员)?我可以只在 Context 上使用 Selection 方法,但我必须检查它的身份以确定它是否真的存在。我所做的是维护一个已加载部门的列表,然后检查我的部门是否在该列表中,然后获取或创建部门。

在这个过程中,我引入了另一个管理我所有部门列表的角色。现在,我要发送给我的 Item B actor 的所有消息都必须经过管理所有部门的 Actor、Department 3 Actor,然后最后发送到 Item B actor。现在感觉比以前更糟了。

现在我还有部门主管,它知道所有消息必须经过的所有加载部门(部门目标消息和项目目标消息)。在这一点上,所有消息都流经这个我现在担心性能和可维护性的单一参与者。

所以我的问题是:有没有更好的方法来保持这种父/子关系,同时保持有状态,并且能够在不知道它所在的部门是否已加载或是否正在加载的情况下向项目发送消息自己加载了吗?

有一些讨论here regarding checking if an Actor exists. One strategy is to create all your Department actors using a supervisor and use this to manage failures as discussed here。您的主管会知道哪些 Actors 已经创建,并且会在失败时收到通知,因此您可以在这里处理它。

是否需要将 actors 拆分为 Items?对我来说,它们听起来更像是消息类型。你能不能只对部门建模,然后向他们发送项目消息?或者,您可以拥有 DepartmentItem Actor 吗? (即没有部门演员,只是为项目建模?)。如果您确实需要将 Items 建模为 Actors,那么我认为您所拥有的是正确的路径 - 使用 children 的主管是可行的方法。如果有帮助,您可以随时转发消息:

target.Forward(result, Context);