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  }