anthdm/hollywood

Cluster ActivationStrategy

clifinger opened this issue · 0 comments

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")