如何向正在观看特定演员的所有演员播放消息?
对于上下文,假设我有大量AuctionActor
类型正在监视的AuctionParticipantActor
(可能是远程参与者)。我希望AuctionActor
向AuctionParicipantActor
类型广播各种消息。
一种可能性是AuctionActor
保留所有参与者ActorRef
实例的集合,然后在需要向所有参与者发送消息时循环遍历此集合。这似乎效率低下,我希望有更好的解决方案......
答案 0 :(得分:1)
如果您不想按照Diego Martinoia的说法使用PubSub,我建议Routers
使用BroadcastingLogic
。这与你在ActorRefs集合中提到的方向有关,但是使用Akka功能来实现它比仅仅迭代AuctionActor
中的集合更有效。
来自Akka Docs
路由器旨在极其高效地接收消息并将其快速传递给路由器。
普通的actor可以用于路由消息,但是actor的单线程处理可能成为瓶颈。通过优化通常允许并发路由的消息处理管道,路由器可以实现更高的吞吐量。
在您的情况下,它可能如下所示:
class AuctionActor extends Actor {
var router = Router(BroadcastRoutingLogic(), Vector[ActorRefRoutee]())
def receive = {
case AddParticipant(ref) =>
router = router.addRoutee(ref)
case RemoveParticipant(ref) =>
router = router.removeRoutee(ref)
case update: ImportantUpdate =>
router.route(update, self)
}
}