2017-06-20 115 views
0

如何向所有正在观看特定演员的演员播放讯息?向观看特定演员的演员广播消息?

对于上下文,假设我有一个AuctionActor(这可能是一个远程角色),正在被大量的AuctionParticipantActor类型监视。我想AuctionActor广播各种消息到AuctionParicipantActor类型。

一种可能性是AuctionActor保留所有参与者ActorRef实例的集合,然后在需要将消息发送给所有参与者时循环该集合。这似乎是低效的,我希望有一个更好的解决方案...

+1

分布式PubSub的带有主题是演员的名字似乎是一个更好的解决方案比看这里 –

+0

做你'AuctionParticipantActor's只能眼睁睁地看着一个' AuctionActor'或多个? – thwiegan

+0

@thwiegan通常,每个'AuctionParticipantActor'想要监控多个'AuctionActor'实例。 – davidrpugh

回答

0

如果你不希望由迭戈Martinoia提到与PubSub去,我会建议使用RoutersBroadcastingLogic。这与您提到的ActorRefs集合的方向一致,但使用Akka功能来实现它比遍历AuctionActor中的集合更有效。

从阿卡Docs

路由器被设计为在接收消息,并迅速将它们传递到routees效率极高。

正常的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) 
    } 
} 
+0

'ActorRef'对于本地演员或远程演员有影响吗?我认为不是... – davidrpugh

+0

这是一个很好的问题。我希望它是位置透明的,但我认为它不应该很难测试。你可以试一试,如果我能做到的话,我也会这么做。如果你能提供更新,会很棒。这似乎是远程路由器的信息:http://doc.akka.io/docs/akka/current/scala/routing.html#remote-deployed-routees但是,看起来它是用来在远程系统上创建路由,在你的情况下,路线已经存在。 – thwiegan

+0

@davidrpugh经过测试,可以在不改变代码的情况下使用远程路由。 – thwiegan