2016-08-05 105 views
0

我正在学习akka,我不知道如何最好地组织,获取/创建我的演员。akka.net管理演员hiearchy和创建/获取演员

现在我有一个像

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

如果我想执行的C项任务是在3系是什么做到这一点的最佳方式的设置?

我目前已经设置了一切,所以我必须告诉部门3一条消息,然后在部门3的演员,我会告诉项目C演员相同的消息。

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

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

通过这个过程,我介绍了另一位演员,负责管理我所有部门的列表。现在,我想要发送给我的项目B演员的所有消息都必须经过管理所有部门的演员,部门3演员,最后到项目B演员。现在感觉比以前更糟糕了。

现在我也有部门主管了解所有加载所有消息必须经过的部门(部门目标消息和项目目的地消息)。在这一点上,所有的消息流经这个单身演员,我现在担心性能和可维护性。

所以我的问题是:是否有一个更好的方式来保持有状态的这个父/子关系,并且能够发送消息到一个Item而不知道它所在的Department是否被加载,或者它是否被加载本身?

回答

2

关于检查Actor是否存在,有一些讨论here。一种策略是使用主管人员创建所有部门主管并使用它来管理故障,如here所述。你的主管会知道哪些演员已经创建,并会在失败时得到通知,所以你可以在这里处理。

您是否需要将演员分成项目?它们听起来更像是我的消息类型。你不能只是模拟部门,然后发送他们的项目消息?或者,你可以有DepartmentItem Actor? (即没有部门演员,只是模拟项目?)。如果你确实需要将项目建模为演员,那么我认为你拥有的是正确的道路 - 带着孩子的主管是一条路。如果有帮助,您可以随时转发邮件:

target.Forward(result, Context);