【发布时间】:2016-12-16 11:14:24
【问题描述】:
请允许我抽象一下我经常面对演员的问题,以及解决这个问题的常见设计模式。假设我有以下演员层次结构:
── user
└── ServiceActor
├── TicketManager
│ ├── WorkerA
│ ├── WorkerB
│ └── WorkerC
└── UserManager
├── WorkerA
├── WorkerB
└── WorkerC
第一级之外的层次结构,即工单和用户管理器并不重要。我要求 TicketManager 向 UserManager 发送消息,反之亦然。 (请注意,这些只是我使用的示例名称,并不代表任何实际问题)
以下哪个最合适?
选项1:
TicketManager 构造函数将 UserManager 作为构造函数参数。 UserManager 构造函数将 TicketManager 作为构造函数参数。 但是,两者都不能相互递归调用,所以这可能无论如何都不可能。
选项 2:
UserManager 通过 actorSelection 引用 TicketManager 作为 actorSelection("../TicketManager") 等要求,或者仅在启动时引用一次并保留它。
选项 3:
在任何给定时间点,UserManager/TicketManager 都会向其父级 (ServiceActor) 请求对其他兄弟姐妹的引用,并在父级持有该引用时适当地回复 ActorRef。
选项 4:
这种情况不应该是这样吗?我不应该考虑兄弟姐妹互相交谈,因为它以某种方式使设计“复杂化”吗?应该有一个更像树的层次结构吗?如果是这种情况,有什么常见的设计模式可以帮助避免这种情况?
我希望我已经明确了要求,如果需要,请允许我进一步澄清?
【问题讨论】:
-
虽然 Edmondo 建议的初始化策略很有见地,但我最终混合使用了选项 4 和选项 3。选项 4 来解开我的演员层次结构的混乱。除此之外,在任何时候需要兄弟姐妹互相交谈时,他们都会通过父母进行交谈。我认为这是一个合理的模式。
标签: scala design-patterns akka actor service-discovery