2017-06-20 120 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