github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/cluster-metrics/member/main.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"time"
     7  
     8  	console "github.com/AsynkronIT/goconsole"
     9  	"github.com/AsynkronIT/protoactor-go/actor"
    10  	"github.com/AsynkronIT/protoactor-go/cluster"
    11  	"github.com/AsynkronIT/protoactor-go/cluster/consul"
    12  	"github.com/AsynkronIT/protoactor-go/eventstream"
    13  	"github.com/AsynkronIT/protoactor-go/examples/cluster/shared"
    14  	"github.com/AsynkronIT/protoactor-go/remote"
    15  )
    16  
    17  // Logger is message middleware which logs messages before continuing to the next middleware
    18  func Logger(next actor.ReceiverFunc) actor.ReceiverFunc {
    19  	fn := func(context actor.ReceiverContext, env *actor.MessageEnvelope) {
    20  		switch env.Message.(type) {
    21  		case *actor.Started:
    22  			log.Printf("actor started " + context.Self().String())
    23  		case *actor.Stopped:
    24  			log.Printf("actor stopped " + context.Self().String())
    25  		}
    26  		next(context, env)
    27  	}
    28  
    29  	return fn
    30  }
    31  
    32  func main() {
    33  	// this node knows about Hello kind
    34  	remote.Register("Hello", actor.PropsFromProducer(func() actor.Actor {
    35  		return &shared.HelloActor{}
    36  	}).WithReceiverMiddleware(Logger))
    37  
    38  	//
    39  	eventstream.Subscribe(func(event interface{}) {
    40  		switch msg := event.(type) {
    41  		case *cluster.MemberJoinedEvent:
    42  			log.Printf("Member Joined " + msg.Name())
    43  		case *cluster.MemberLeftEvent:
    44  			log.Printf("Member Left " + msg.Name())
    45  		case *cluster.MemberRejoinedEvent:
    46  			log.Printf("Member Rejoined " + msg.Name())
    47  		case *cluster.MemberUnavailableEvent:
    48  			log.Printf("Member Unavailable " + msg.Name())
    49  		case *cluster.MemberAvailableEvent:
    50  			log.Printf("Member Available " + msg.Name())
    51  		case cluster.ClusterTopologyEvent:
    52  			log.Printf("Cluster Topology Poll")
    53  		}
    54  	})
    55  
    56  	cp, err := consul.New()
    57  	if err != nil {
    58  		log.Fatal(err)
    59  	}
    60  	cluster.Start("mycluster", "127.0.0.1:8081", cp)
    61  
    62  	sync()
    63  	async()
    64  
    65  	console.ReadLine()
    66  }
    67  
    68  func sync() {
    69  	hello := shared.GetHelloGrain("abc")
    70  	options := cluster.NewGrainCallOptions().WithTimeout(5 * time.Second).WithRetry(5)
    71  	res, err := hello.SayHelloWithOpts(&shared.HelloRequest{Name: "GAM"}, options)
    72  	if err != nil {
    73  		log.Fatal(err)
    74  	}
    75  	log.Printf("Message from SayHello: %v", res.Message)
    76  	for i := 0; i < 10000; i++ {
    77  		x := shared.GetHelloGrain(fmt.Sprintf("hello%v", i))
    78  		x.SayHello(&shared.HelloRequest{Name: "GAM"})
    79  	}
    80  	log.Println("Done")
    81  }
    82  
    83  func async() {
    84  	hello := shared.GetHelloGrain("abc")
    85  	c, e := hello.AddChan(&shared.AddRequest{A: 123, B: 456})
    86  
    87  	for {
    88  		select {
    89  		case <-time.After(100 * time.Millisecond):
    90  			log.Println("Tick..") // this might not happen if res returns fast enough
    91  		case err := <-e:
    92  			log.Fatal(err)
    93  		case res := <-c:
    94  			log.Printf("Result is %v", res.Result)
    95  			return
    96  		}
    97  	}
    98  }