我正在学习akka,我不确定如何最好地组织,获取/创建我的演员。
现在我有一个像
这样的设置Department (1000s) can each have many items (10000s) and each item has properties and work that can be done to it
如果我想在第3部分的项目C上执行任务,那么实现这一目标的最佳方法是什么?
我目前已经设置了一切,所以我必须告诉Department 3一个消息,然后在Department 3 actor中我会告诉Item C actor同样的消息。
我看到这个问题是我想告诉Item我需要处理2个地方的消息(部门和项目)。这对我来说是错的,但也许是因为我不理解这种模式。
我也希望这是有状态的,所以我希望演员能够坚持下去。这给我带来了另一个挑战。我如何知道部门3是否已加载(一旦我有部门3,我怎么知道是否有一个初始化的项目B的演员)?我可以在Context上使用Selection方法但是我必须检查它的身份以确定它是否真的存在。我所做的是维护已加载部门的列表,然后检查我的部门是否在该列表中,然后获得部门或创建部门。
通过这个过程,我介绍了另一个管理我所有部门列表的演员。现在,我要发送给我的Item B actor的所有消息都必须通过管理所有部门的Actor,Department 3 Actor,然后最终到项目B actor。现在感觉比以前更糟。
现在我还有部门主管,它知道所有消息必须经过的所有部门(部门目的地消息和项目目的地消息)。此时所有消息都流经这个单个actor,我现在担心性能和可维护性。
所以我的问题是:是否有更好的方法来保持这种父/子关系,同时保持有状态,并能够在不知道它所在的部门是否已加载或是否已加载本身的情况下向项目发送消息?
答案 0 :(得分:2)
关于检查Actor是否存在,有一些讨论here。一种策略是使用主管创建所有部门主管,并使用它来管理故障here。您的主管会知道哪些Actors已经创建,并会在失败时收到通知,因此您可以在此处理。
你需要将演员分成物品吗?它们听起来更像是我的消息类型。你能不只是为Departments建模然后发送它们的Item消息?或者,你有DepartmentItem Actors吗? (即没有部门演员,只为项目建模?)。如果您确实需要将项目作为演员建模,那么我认为您所拥有的是正确的道路 - 带孩子的主管是可行的方法。如果消息有帮助,您可以随时转发消息:
target.Forward(result, Context);