I first had to reference the remote actor names that I wanted to use within my configuration:
var config = ConfigurationFactory.ParseString(@"
akka {
log-config-on-start = on
stdout-loglevel = DEBUG
loglevel = DEBUG
actor {
provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
debug {
receive = on
autoreceive = on
lifecycle = on
event-stream = on
unhandled = on
}
deployment {
/localactor {
router = consistent-hashing-pool
nr-of-instances = 5
virtual-nodes-factor = 10
}
/remoteactor1 {
router = consistent-hashing-pool
nr-of-instances = 5
remote = ""akka.tcp://system2@localhost:8080""
}
/remoteactor2 {
router = consistent-hashing-pool
nr-of-instances = 5
remote = ""akka.tcp://system2@localhost:8080""
}
/remoteactor3 {
router = consistent-hashing-pool
nr-of-instances = 5
remote = ""akka.tcp://system2@localhost:8080""
}
}
}
remote {
dot-netty.tcp {
port = 8090
hostname = localhost
}
}
}
");
I then remote deployed the actors:
//create a remote deployed actor
var remote1 = system.ActorOf(Props.Create(() => new SomeActor(null, 123)).WithRouter(FromConfig.Instance), "remoteactor1");
var remote2 = system.ActorOf(Props.Create(() => new SomeActor(null, 456)).WithRouter(FromConfig.Instance), "remoteactor2");
var remote3 = system.ActorOf(Props.Create(() => new SomeActor(null, 789)).WithRouter(FromConfig.Instance), "remoteactor3");
I then had to add the actors that were recently deployed to a ConsistentHashingGroup instance:
var hashGroup = system.ActorOf(Props.Empty.WithRouter(new ConsistentHashingGroup(config)));
Task.Delay(500).Wait();
var routee1 = Routee.FromActorRef(remote1);
hashGroup.Tell(new AddRoutee(routee1));
var routee2 = Routee.FromActorRef(remote2);
hashGroup.Tell(new AddRoutee(routee2));
var routee3 = Routee.FromActorRef(remote3);
hashGroup.Tell(new AddRoutee(routee3));
I was then able to use the router instance to send messages:
for (var i = 0; i < 5; i++)
{
for (var j = 0; j < 7; j++)
{
var message = new SomeMessage(j, $"remote message: {j}");
hashGroup.Tell(message, someSender);
}
}