2017-06-20 2 views
0

Comment puis-je diffuser un message à tous les acteurs qui regardent un acteur en particulier? Pour le contexte, supposons que j'ai un AuctionActor (qui est potentiellement un acteur distant) qui est surveillé par un grand nombre de types AuctionParticipantActor. Je voudrais que le AuctionActor diffuse divers messages aux types AuctionParicipantActor.Diffuser un message aux acteurs qui regardent un acteur en particulier?

Une possibilité serait que le AuctionActor conserve une collection de toutes les instances ActorRef du participant, puis boucle sur cette collection chaque fois qu'un message doit être envoyé à tous les participants. Cela semble inefficace et j'espère une meilleure solution ...

+1

Distribué PubSub avec le sujet étant le nom de l'acteur semble une meilleure solution que de regarder ici –

+0

Faites votre 'AuctionParticipantActor's regarder un seul' AuctionActor' ou multiple? – thwiegan

+0

@thwiegan En général, chaque 'AuctionParticipantActor' voudrait surveiller plusieurs instances' AuctionActor'. – davidrpugh

Répondre

0

Si vous ne voulez pas aller avec PubSub comme mentionné par Diego Martinoia, je suggère d'utiliser Routers avec BroadcastingLogic. Cela va dans la direction que vous avez mentionnée avec la collection de ActorRefs, mais utilise la fonctionnalité Akka pour y parvenir étant plus efficace que simplement itérer sur une collection dans votre AuctionActor.

De Akka Docs

Les routeurs sont conçus pour être extrêmement efficace à la réception de messages et de les transmettre rapidement à routées.

Un acteur normal peut être utilisé pour le routage des messages, mais le traitement mono-thread d'un acteur peut devenir un goulot d'étranglement. Les routeurs peuvent atteindre un débit beaucoup plus élevé avec une optimisation du pipeline de traitement des messages habituel qui permet le routage simultané.

Dans votre cas, il pourrait ressembler à ceci:

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

Est-ce que l'acteur 'ActorRef' est important pour un acteur local ou un acteur distant? Je ne pense pas ... – davidrpugh

+0

C'est une bonne question. Je m'attendrais à ce que l'emplacement soit transparent, mais je pense que cela ne devrait pas être difficile à tester. Vous pouvez essayer, je le ferai aussi, si j'y arrive. Ce serait génial si vous pouvez donner une mise à jour. Ici semble être l'info aux routeurs distants: http://doc.akka.io/docs/akka/current/scala/routing.html#remote-deployed-routees Mais on dirait qu'il est utilisé pour créer les routes sur les systèmes distants , où comme dans votre cas les routes existent déjà. – thwiegan

+0

@davidrpugh Testé, fonctionne avec des routes à distance sans modifications du code. – thwiegan