1
votes

In Scala, if I register a remote actor using alive(0), the actor is registered at a random port. I can do the registration like this: register('fooParActor, self) in the act method.

Now, on the master/server side, I can select an actor by supplying the port. Do I need to manually scan the ports in order to use random ports?

The problem I am trying to solve is to create n actors on a node and then select them all at a master/server program, e.g. start 10 slaves on node x and get a list 10 remote actors at node y.

How is this done?

2

2 Answers

1
votes

There's no need to register various ports for the actors. Instead you need one port for the whole actor system - more precisely the akka kernel (that the server needs to know too). See this page of the documentation for how all of this works in detail.

In order to select a remote actor you can then look it up via its path in the remote actor system, similarly to something like this:

context.actorFor("akka://[email protected]:2552/user/someActorName/1")

In that case, you would have created the n actors as children of the someActorName actor and given them the names 1 to n (so you could get the others via .../someActorName/2, .../someActorName/3 and so on).

There's no need to randomize anything at all here and given how you described the problem, there is also no need for randomization within that. You simply start the 10 actors up and number them from 1 to 10. Any random numbers would just unnecessarily complicate things.

As for really random ports I can only agree with sourcedelica. You need a fixed port to communicate the random ones, or some other way of communications. If someone doesn't know where to communicate to due to the random port it simply won't work.

0
votes

You need to have at least one ActorSystem with a well known port. Then the other ActorSystems can use port 0 to have Akka assign a random port. The slave ActorSystems will have actors register with an actor on the Master so it knows all of the remote systems.

If you absolutely need to have your master use a random port it will need to communicate its port out of band (using a shared filesystem or database).