github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/rpc/nats/subscriber_test.go (about) 1 package nats_test 2 3 import ( 4 "context" 5 "sync/atomic" 6 "testing" 7 "time" 8 9 "github.com/angenalZZZ/gofunc/data/random" 10 "github.com/angenalZZZ/gofunc/f" 11 nat "github.com/angenalZZZ/gofunc/rpc/nats" 12 "github.com/nats-io/nats.go" 13 ) 14 15 var err error 16 17 func TestSubscriber(t *testing.T) { 18 // New Client Connect. 19 nat.Subject = "TestSubscriber" 20 nat.Conn, err = nat.New("nats.go", "", "", "HGJ766GR767FKJU0", "", "") 21 if err != nil { 22 t.Fatalf("[nats] failed to connect: %s\n", err.Error()) 23 } 24 25 ctx, wait := f.ContextWithWait(context.Background()) 26 27 // Create a subscriber for Client Connect. 28 sub := nat.NewSubscriber(nat.Conn, nat.Subject, func(msg *nats.Msg) { 29 if msg.Data[0] != '{' { 30 t.Logf("[nats] received test message on %q: %s", msg.Subject, string(msg.Data)) 31 } 32 f.DoneContext(ctx) 33 }) 34 35 // Ping a message. 36 go func() { 37 time.Sleep(time.Millisecond) 38 err = nat.Conn.Publish(sub.Subj, []byte("ping")) 39 if err != nil { 40 t.Fatalf("[nats] failed publishing a test message > %s", err.Error()) 41 } else { 42 t.Logf("[nats] successful publishing a test message") 43 } 44 }() 45 46 sub.Run(wait) 47 } 48 49 // Take time 770ms:60bytes, 4.52s:500bytes to process 1 million records, 50 // run times 1298700:60Bytes, 220848:500bytes Qps.(4CPU+16G+MHD) 51 func TestBenchmarkPublisher(t *testing.T) { 52 // New Client Connect. 53 nat.Subject = "BenchmarkPublisher" 54 nat.Conn, err = nat.New("nats.go", "", "", "HGJ766GR767FKJU0", "", "") 55 if err != nil { 56 t.Fatalf("[nats] failed to connect: %s\n", err.Error()) 57 } 58 59 var publishedNumber, succeededNumber, failedNumber int64 60 61 // Create a subscriber for Client Connect. 62 sub := nat.NewSubscriber(nat.Conn, nat.Subject, func(msg *nats.Msg) { 63 atomic.AddInt64(&succeededNumber, 1) 64 }) 65 66 ctx, wait := f.ContextWithWait(context.TODO()) 67 go sub.Run(wait) 68 time.Sleep(time.Millisecond) 69 70 var bufferData = random.AlphaNumberBytes(500) 71 72 // start benchmark test 73 t1 := time.Now() 74 75 // test publish pressure 76 for i := 0; i < 1000000; i++ { 77 err = nat.Conn.Publish(sub.Subj, bufferData) 78 if err != nil { 79 failedNumber++ 80 } else { 81 publishedNumber++ 82 } 83 } 84 85 // wait succeeded-number equals published-number 86 f.NumIncrWait(&publishedNumber, &succeededNumber) 87 t2 := time.Now() 88 ts := t2.Sub(t1) 89 //time.Sleep(time.Millisecond) 90 f.DoneContext(ctx) 91 92 t.Logf("Publish Number: %d, Successful Number: %d, Failed Number %d", publishedNumber, succeededNumber, failedNumber) 93 t.Logf("Take time %s, handle received messages %d qps", ts, 1000*succeededNumber/ts.Milliseconds()) 94 }