I'm trying to make a ShardAllocationStrategy that allocates new shards to
ShardRegion's such that the difference between the most and the least
number of allocated shards is 1 and so that it doesn't do any re-balancing.
This is what I came up with:
public class NonRebalancingLeastShardAllocationStrategy implements
ShardCoordinator.ShardAllocationStrategy {
@Override
public ActorRef allocateShard(ActorRef actorRef, String s,
Map<ActorRef, IndexedSeq<String>> actorRefIndexedSeqMap) {
return new ShardCoordinator.LeastShardAllocationStrategy(1,
10).allocateShard(actorRef, s, actorRefIndexedSeqMap);
}
@Override
public Set<String> rebalance(scala.collection.immutable.Map<ActorRef,
scala.collection.immutable.IndexedSeq<String>> actorRefIndexedSeqMap,
Set<String> stringSet) {
return new HashSet<>();
}
}
For the non-rebalancing part, returning an empty HashSet works fine. It's
the allocateShard method that is giving me issues. For example, when I to
instantiate just 2 instances of an entry in my cluster such that each
instance ends up on a different node, I pass the following 2 messages to my
shard region:
ActorRef region = ClusterSharding.get(system).shardRegion("Region");
region.tell(new ShardMessage(new Object(), "1", "1"), null);
region.tell(new ShardMessage(new Object(), "2", "2"), null);
In this case my MessageExtractor will use the last 2 arguments of a
ShardMessage
as the entryId and shardId respectively. In the example above, if my
cluster has 2 nodes, one shard of my entry should get created in one of the
nodes and the second shard should get created in the other node. However,
I've found that there are cases where when I start up my cluster (I have
set the min-nr-of-members = 2 in my configuration), both of the shards will
end up on the same node.
This leads to me wonder if there would be any cases where such a
ShardAllocationStrategy as the one I defined above would cause the cluster
to not evenly distribute shards. From my testing this seems to happen at
random. Does setting the allocateShard to use the
LeastShardAllocationStrategy's allocateShard method with the parameters I
defined above guaranteed to always distribute my shards evenly? Does it
work on a sort of "best effort" where shard distribution is not always
guaranteed to happen evenly? Am I maybe starting up the 2 nodes in my
cluster too fast (I figure this one is probably a long shot)?
--
>>>>>>>>>> Read the docs: http://akka.io/docs/
>>>>>>>>>> Check the FAQ:
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
---
You received this message because you are subscribed to the Google Groups "Akka
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.