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

     1  package main
     2  
     3  import (
     4  	"log"
     5  	"runtime"
     6  	"sort"
     7  	"time"
     8  
     9  	"fmt"
    10  
    11  	console "github.com/AsynkronIT/goconsole"
    12  	"github.com/AsynkronIT/protoactor-go/actor"
    13  	"github.com/AsynkronIT/protoactor-go/examples/remotelatency/messages"
    14  	"github.com/AsynkronIT/protoactor-go/mailbox"
    15  	"github.com/AsynkronIT/protoactor-go/remote"
    16  )
    17  
    18  type remoteActor struct {
    19  	i        int
    20  	start    int64
    21  	messages []int64
    22  }
    23  
    24  func makeTimestamp() int64 {
    25  	return time.Now().UnixNano() / int64(time.Millisecond)
    26  }
    27  
    28  type int64arr []int64
    29  
    30  func (a int64arr) Len() int           { return len(a) }
    31  func (a int64arr) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    32  func (a int64arr) Less(i, j int) bool { return a[i] < a[j] }
    33  
    34  func (state *remoteActor) Receive(context actor.Context) {
    35  	switch msg := context.Message().(type) {
    36  	case *messages.Start:
    37  		context.Respond(&messages.Started{})
    38  	case *messages.Ping:
    39  		now := makeTimestamp()
    40  		latency := now - msg.Time
    41  		if state.i == 0 {
    42  			log.Println("starting")
    43  			state.start = makeTimestamp()
    44  		}
    45  
    46  		state.messages[state.i] = latency
    47  		state.i++
    48  		if state.i == 1000000 {
    49  			done := makeTimestamp()
    50  			delta := done - state.start
    51  			log.Printf("Test took %v ms", delta)
    52  
    53  			a := int64arr(state.messages)
    54  			sort.Sort(a)
    55  
    56  			data := make(map[string]int64)
    57  			for i := 0; i < 100; i++ {
    58  				key := fmt.Sprintf("%v", i)
    59  				data[key] = state.messages[i*10000]
    60  			}
    61  
    62  			data["99.9"] = state.messages[999000]
    63  			data["99.99"] = state.messages[999900]
    64  
    65  			log.Println("Done")
    66  			for k, v := range data {
    67  				log.Printf("%v %v", k, v)
    68  			}
    69  		}
    70  	}
    71  }
    72  
    73  func newRemoteActor() actor.Producer {
    74  	return func() actor.Actor {
    75  		return &remoteActor{
    76  			i:        0,
    77  			messages: make([]int64, 1000000),
    78  		}
    79  	}
    80  }
    81  
    82  func main() {
    83  	runtime.GOMAXPROCS(runtime.NumCPU())
    84  	runtime.GC()
    85  
    86  	remote.Start("127.0.0.1:8080", remote.WithEndpointWriterBatchSize(10000))
    87  	rootContext := actor.EmptyRootContext
    88  	props := actor.
    89  		PropsFromProducer(newRemoteActor()).
    90  		WithMailbox(mailbox.Bounded(1000))
    91  
    92  	rootContext.SpawnNamed(props, "remote")
    93  
    94  	console.ReadLine()
    95  }