Files
NixMsg/test/load/cmd/mqttbench/main.go
T

83 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"syscall"
"time"
"git.asio.asia/nixevol/NixMsg/test/load"
)
func main() {
httpBase := flag.String("http", "", "服务 HTTP 根(WebSocket /mqtt 与管理/注册接口),如 http://127.0.0.1:12345")
adminHTTP := flag.String("admin-http", "", "管理接口根;默认与 -http 相同")
tcp := flag.String("tcp", "", "裸 MQTT TCP host:port;非空则 MQTT 走 TCP,HTTP 仍用于开通端")
n := flag.Int("n", 50, "在线连接数")
rate := flag.Float64("rate", 20, "单聊提交每秒条数")
duration := flag.Duration("duration", time.Minute, "单聊持续时长;0 表示跳过单聊")
hold := flag.Duration("hold", 0, "连上后先保持这么久再跑收发")
groupSize := flag.Int("group-size", -1, "群发成员数;默认与 -n 相同,0 表示跳过群发")
prefix := flag.String("prefix", "qb", "端编号前缀(小写)")
password := flag.String("password", "password1234", "端登录密码")
adminUser := flag.String("admin-user", "admin", "管理员用户名")
adminPass := flag.String("admin-pass", "", "管理员密码(批量开通)")
adminToken := flag.String("admin-token", "", "管理 API 令牌,与密码二选一")
regCode := flag.String("register-code", "", "自助注册安全码(不走管理开通时使用)")
reuse := flag.Bool("reuse", false, "编号已存在则跳过开通/注册")
scenario := flag.String("scenario", "all", "hold | dm | group | all")
flag.Parse()
if *httpBase == "" && *tcp == "" {
fmt.Fprintln(os.Stderr, "usage: mqttbench -http http://host:port [options]")
flag.PrintDefaults()
os.Exit(2)
}
gs := *groupSize
if gs < 0 {
gs = *n
}
cfg := load.Config{
HTTPBase: *httpBase,
AdminHTTP: *adminHTTP,
TCPAddr: *tcp,
AdminUser: *adminUser,
AdminPass: *adminPass,
APIToken: *adminToken,
RegisterCode: *regCode,
Reuse: *reuse,
Password: *password,
Prefix: *prefix,
N: *n,
Rate: *rate,
Duration: *duration,
Hold: *hold,
GroupSize: gs,
Scenario: *scenario,
}
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
done := make(chan struct{})
var runErr error
var report *load.Report
go func() {
defer close(done)
report, runErr = load.Run(cfg)
}()
select {
case <-done:
case <-stop:
fmt.Fprintln(os.Stderr, "interrupted")
os.Exit(130)
}
if runErr != nil {
fmt.Fprintln(os.Stderr, runErr)
os.Exit(1)
}
fmt.Print(report.Format())
}