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 }