Cluster ActivationStrategy
clifinger opened this issue · 0 comments
clifinger commented
Dear Sir, Meneer, Monsieur @anthdm ,
I am pretty new in Golang, I want to send messages to all members using the same kind, it's not clean but it is what it is !
Can you drive me by let me know where to change in the cluster library to have like SendToAllByKind and SendToAllByKindInRegion ?
I can do a PR and will try to respect the way you code with WithConfig etc...
type regionBasedActivationStrategy struct {
fallback string
member *cluster.Member
}
func SendToAll(c *cluster.Cluster, ctx *actor.Context, msg string, kind string) {
members := c.Members()
for _, member := range members {
strategy := RegionBasedActivationStrategy("default", member)
actorPID := c.Activate(kind, cluster.NewActivationConfig().WithSelectMemberFunc(
strategy.ActivateOnMember).WithID(member.ID))
message := &remote.TestMessage{Data: []byte(msg)}
ctx.SendRepeat(actorPID, message, time.Millisecond*10)
}
}
func RegionBasedActivationStrategy(fallback string, member *cluster.Member) regionBasedActivationStrategy {
return regionBasedActivationStrategy{
fallback: fallback,
member: member,
}
}
func (as regionBasedActivationStrategy) ActivateOnMember(details cluster.ActivationDetails) *cluster.Member {
if as.member != nil {
return as.member
}
members := filterMembersByRegion(details.Members, details.Region)
if len(members) > 0 {
return members[rand.Intn(len(members))]
}
// if we could not find a member for the region, try to fall back.
members = filterMembersByRegion(details.Members, as.fallback)
if len(members) > 0 {
return members[rand.Intn(len(members))]
}
return nil
}
and in the main.go:
case Internal:
shared.SendToAll(c, ctx, msg.Message, "playerSession")