github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/23_proto_actor/cluster/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/examples/cluster/shared"
    13  	"github.com/AsynkronIT/protoactor-go/remote"
    14  )
    15  
    16  func main() {
    17  	// this node knows about Hello kind
    18  	remote.Register("Hello", actor.PropsFromProducer(func() actor.Actor {
    19  		return &shared.HelloActor{}
    20  	}))
    21  
    22  	cp, err := consul.New()
    23  	if err != nil {
    24  		log.Fatal(err)
    25  	}
    26  	cluster.Start("mycluster", "127.0.0.1:8081", cp)
    27  
    28  	sync()
    29  	async()
    30  
    31  	console.ReadLine()
    32  
    33  	cluster.Shutdown(true)
    34  }
    35  
    36  func sync() {
    37  	hello := shared.GetHelloGrain("abc")
    38  	options := cluster.NewGrainCallOptions().WithTimeout(5 * time.Second).WithRetry(5)
    39  
    40  	res, err := hello.SayHelloWithOpts(&shared.HelloRequest{Name: "GAM"}, options)
    41  	if err != nil {
    42  		log.Fatal(err)
    43  	}
    44  	log.Printf("Message from SayHello: %v", res.Message)
    45  	for i := 0; i < 10000; i++ {
    46  		x := shared.GetHelloGrain(fmt.Sprintf("hello%v", i))
    47  		x.SayHello(&shared.HelloRequest{Name: "GAM"})
    48  	}
    49  	log.Println("Done")
    50  }
    51  
    52  func async() {
    53  	hello := shared.GetHelloGrain("abc")
    54  	c, e := hello.AddChan(&shared.AddRequest{A: 123, B: 456})
    55  
    56  	for {
    57  		select {
    58  		case <-time.After(100 * time.Millisecond):
    59  			log.Println("Tick..") // this might not happen if res returns fast enough
    60  		case err := <-e:
    61  			log.Fatal(err)
    62  		case res := <-c:
    63  			log.Printf("Result is %v", res.Result)
    64  			return
    65  		}
    66  	}
    67  }