2017-06-20 3 views
0

特定の俳優を見ているすべての俳優にメッセージをブロードキャストするにはどうすればよいですか?特定のアクタを見ているアクタにメッセージをブロードキャストしますか?

コンテキストの場合、多くのAuctionParticipantActorタイプで監視されているAuctionActor(リモートアクタの可能性があります)があるとします。私はAuctionParicipantActorタイプにさまざまなメッセージをブロードキャストするようにAuctionActorを希望します。

AuctionActorは、すべての参加者ActorRefインスタンスのコレクションを保持し、すべての参加者にメッセージを送信する必要があるときにこのコレクションをループする可能性があります。あなたはディエゴ・Martinoiaで述べたようにPubSubに行きたくない場合は、私はBroadcastingLogicRoutersを使用することをお勧めし

+1

はここ –

+0

を見ているよりも、よりよい解決策は、あなたの 'AuctionParticipantActor'sは'一つだけを見てくださいと思われますAuctionActor'または複数の? – thwiegan

+0

@thwiegan一般に、それぞれの 'AuctionParticipantActor'は複数の' AuctionActor'インスタンスを監視したいでしょう。 – davidrpugh

答えて

0

...これは非効率ですし、私はよりよい解決策を期待しています。これは、ActorRefのコレクションで言及した方向に向いていますが、Akkaの機能を使用して、AuctionActorのコレクションを反復するよりも効率的です。

アッカDocs

から、ルータは、メッセージを受信し、routeesへ上すぐにそれらを渡すことで、非常に効率的になるように設計されています。

通常のアクターはメッセージのルーティングに使用できますが、アクターのシングルスレッド処理はボトルネックになります。ルータは、並行ルーティングを可能にする通常のメッセージ処理パイプラインに対する最適化により、より高いスループットを達成することができる。

それは次のようになりますあなたの場合は

:トピックは俳優の名前であることをPubSubの分散

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

関連する問題