Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	game/game_cluster/robot_client/main.go
#	net/actor/system.go
liliang 7 mesiacov pred
rodič
commit
62ef845979

+ 45 - 0
extend/string/string.go

@@ -3,6 +3,7 @@ package mhayaString
 import (
 	"encoding/json"
 	"math/rand"
+	"regexp"
 	"strconv"
 	goStrings "strings"
 )
@@ -155,3 +156,47 @@ func GetRandString(num int) string {
 	}
 	return string(b)
 }
+
+// ConvertToBase58 将给定的整数转换为58进制的字符串表示。
+func ConvertToBase58(num int64) string {
+	if num == 0 {
+		return "1" // 0在58进制中表示为"1"
+	}
+	var result goStrings.Builder
+	digits := "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" // 58进制的基数字符
+	for num > 0 {
+		remainder := num % 58
+		result.WriteByte(digits[remainder])
+		num /= 58
+	}
+	// 因为我们是从低位到高位构建的字符串,所以最终需要反转
+	return reverseString(result.String())
+}
+
+// reverseString 反转字符串
+func reverseString(s string) string {
+	runes := []rune(s)
+	for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
+		runes[i], runes[j] = runes[j], runes[i]
+	}
+	return string(runes)
+}
+
+const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+
+func RandStringBytes(n int) string {
+	b := make([]byte, n)
+	for i := range b {
+		b[i] = letterBytes[rand.Intn(len(letterBytes))]
+	}
+	return string(b)
+}
+
+// ReplaceDigitsWithBase58 在字符串中替换所有的数字为58进制表示
+func ReplaceDigitsWithBase58(input string) string {
+	re := regexp.MustCompile(`\d+`) // 匹配一个或多个数字
+	return re.ReplaceAllStringFunc(input, func(match string) string {
+		num, _ := strconv.ParseInt(match, 10, 64)
+		return ConvertToBase58(num)
+	})
+}

+ 8 - 16
game/game_cluster/internal/guid/guid.go

@@ -1,25 +1,17 @@
 package guid
 
 import (
-	"context"
-	csnowflake "github.com/mhaya/extend/snowflake"
-	"github.com/mhaya/game/game_cluster/internal/mdb"
+	"github.com/google/uuid"
+	cstring "github.com/mhaya/extend/string"
+	"strings"
 )
 
 // Next 生成唯一id
 // 以下几种方式仅供参考:
-// snowflake
-// redis
 func Next() string {
-	node, _ := csnowflake.NewNode(1)
-	var sid string
-	for {
-		id := node.Generate()
-		sid = id.Base58()
-		if mdb.RDB.HExists(context.Background(), "PlayerID", sid).Val() {
-			continue
-		}
-		mdb.RDB.HSet(context.Background(), "PlayerID", sid, 1)
-		return sid
-	}
+	id := uuid.New()
+	s := id.String()
+	output := cstring.ReplaceDigitsWithBase58(s)
+	output = strings.Replace(output, "-", "", -1)
+	return output
 }

+ 3 - 2
game/game_cluster/internal/mdb/mongo_index.go

@@ -124,9 +124,10 @@ func SetCNameAccountIndex() error {
 		{"userName", 1},
 	}
 	indexModel := mongo.IndexModel{
-		Keys: keys,
+		Keys:    keys,
+		Options: options.Index().SetUnique(true), // 设置索引选项,例如唯一索引
 	}
-	err := Index(indexModel, constant.CNameAccount)
+	err := Unique(indexModel, constant.CNameAccount)
 	if err != nil {
 		return err
 	}

+ 59 - 38
game/game_cluster/robot_client/main.go

@@ -8,56 +8,74 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/param"
 	mhayaLogger "github.com/mhaya/logger"
+	"math/rand"
 	"strconv"
+	"sync"
+	"time"
 )
 
 func main() {
 
 	// 定义命令行标志
 	userOffset := flag.Int("userOffset", 0, "用户偏移量")
-	count := flag.Int("count", 50000, "请求总数")
-	flag.Int("qps", 2000, "最大并发数")
-	url := flag.String("url", "", "请求url")
-	flag.Int("duration", 120, "测试持续时间")
+	count := flag.Int("count", 20000, "请求总数")
+	qps := flag.Int("qps", 50, "最大并发数")
+	url := flag.String("url", "http://127.0.0.1:20000", "请求url")
+	url1 := flag.String("url1", "http://127.0.0.1:20001", "请求url")
+	url2 := flag.String("url2", "http://127.0.0.1:20002", "请求url")
+	url3 := flag.String("url3", "http://127.0.0.1:20003", "请求url")
+	duration := flag.Int("duration", 120, "测试持续时间")
 	flag.Parse()
 
-	//startTime := time.Now()
-	//var wg sync.WaitGroup
-	//wg.Add(*count)
+	startTime := time.Now()
+	var wg sync.WaitGroup
+	wg.Add(*count)
 	// 创建一个 channel 来控制请求的速率
-	//reqCh := make(chan struct{}, *qps)
-
-	//// 控制请求速率的 goroutine
-	//go func() {
-	//	ticker := time.NewTicker(time.Second / time.Duration(*qps))
-	//	defer ticker.Stop()
-	//	for range ticker.C {
-	//		reqCh <- struct{}{}
-	//	}
-	//}()
+	reqCh := make(chan struct{}, *qps)
+
+	// 控制请求速率的 goroutine
+	go func() {
+		ticker := time.NewTicker(time.Second / time.Duration(*qps))
+		defer ticker.Stop()
+		for range ticker.C {
+			reqCh <- struct{}{}
+		}
+	}()
 
 	// 发送请求的 goroutine
-	//go func() {
-	for i := *userOffset; i < *count; i++ {
-		//<-reqCh
-		//go func() {
-		//	defer wg.Done()
-		str := strconv.Itoa(i)
-		account := &param.LoginReq{
-			Pid:      2,
-			OpenID:   str,
-			Platform: "ios",
-			Channel:  "tg",
+	go func() {
+		for i := *userOffset; i < *count; i++ {
+			<-reqCh
+			go func() {
+				defer wg.Done()
+				str := strconv.Itoa(i)
+				account := &param.LoginReq{
+					Pid:      2,
+					OpenID:   str,
+					Platform: "ios",
+					Channel:  "tg",
+				}
+				n := rand.Intn(1)
+				switch n {
+				case 0:
+					RunRobot(*url, account, i)
+				case 1:
+					RunRobot(*url1, account, i)
+				case 2:
+					RunRobot(*url2, account, i)
+				case 3:
+					RunRobot(*url3, account, i)
+				}
+
+			}()
 		}
-		RunRobot(*url, account, i)
-		//}()
-	}
-	//}()
+	}()
 
 	// 等待所有请求完成
-	//wg.Wait()
+	wg.Wait()
 	fmt.Println("All goroutines have finished.")
-	//qpsAchieved := float64(*count) / time.Since(startTime).Seconds()
+	qpsAchieved := float64(*count) / time.Since(startTime).Seconds()
+	fmt.Printf("Sent %d requests in %v, achieved QPS: %.2f\n", *count, duration, qpsAchieved)
 }
 
 func RunRobot(url string, val *param.LoginReq, num int) {
@@ -184,18 +202,21 @@ func Login(url string, params map[string]interface{}, token string) {
 	requestURL := fmt.Sprintf("%s/login", url)
 	jsonBytes, err := mhayaHttp.PostJSONWithHeader(requestURL, params, token)
 	if err != nil {
-		mhayaLogger.Warn(err)
+		mhayaLogger.Warnf("login err: %v", err)
 		return
 	}
 
 	rsp := &code.Result{}
 	err = jsoniter.Unmarshal(jsonBytes, rsp)
 	if err != nil {
-		mhayaLogger.Warn(err)
+		mhayaLogger.Warnf("login Unmarshal err :%v ", err)
 		return
 	}
-
-	mhayaLogger.Debugf("Login OK")
+	if rsp.Code == 0 {
+		mhayaLogger.Debugf("Login OK : %v", rsp.Code)
+	} else {
+		mhayaLogger.Debugf("Login Fail : %v", rsp.Code)
+	}
 
 }
 

+ 1 - 1
net/actor/system.go

@@ -32,7 +32,7 @@ func NewSystem() *System {
 		localInvokeFunc:  InvokeLocalFunc,
 		remoteInvokeFunc: InvokeRemoteFunc,
 		wg:               &sync.WaitGroup{},
-		callTimeout:      5 * time.Second,
+		callTimeout:      10 * time.Second,
 		arrivalTimeOut:   2000,
 		executionTimeout: 2000,
 	}