func main() { runtime.GOMAXPROCS(8) startMode := flag.Int("startMode", 1, " 0 为mock ,1 为正式") bindAddr := flag.String("bindAddr", ":17070", "-bindAddr=:17070") certPath := flag.String("certPath", "./cert.pem", "-certPath=xxxxxx/cert.pem or -certPath=http://") keyPath := flag.String("keyPath", "./key.pem", "-keyPath=xxxxxx/key.pem or -keyPath=http://") runMode := flag.Int("runMode", 0, "-runMode=1(online) ,0(sandbox)") storeCap := flag.Int("storeCap", 1000, "-storeCap=100000 //重发链条长度") logxml := flag.String("log", "log.xml", "-log=log.xml //log配置文件") pprofPort := flag.String("pprof", ":9090", "pprof=:9090 //端口") flag.Parse() go func() { if len(*pprofPort) > 0 { addr, _ := net.ResolveTCPAddr("tcp4", *bindAddr) log.Error(http.ListenAndServe(addr.IP.String()+*pprofPort, nil)) } }() //加载log4go的配置 log.LoadConfiguration(*logxml) //设置启动项 option := server.NewOption(*startMode, *bindAddr, *certPath, *keyPath, *runMode, *storeCap) apnsserver := server.NewApnsHttpServer(option) ch := make(chan os.Signal, 1) signal.Notify(ch, os.Kill) //kill掉的server <-ch apnsserver.Shutdown() log.Info("APNS SERVER IS STOPPED!") }
func Parse() ServerOption { //两种方式都支持 deliveryFirst := flag.Bool("deliveryFirst", false, "-deliveryFirst=true //开启服务端优先投递,false为优先存储") logxml := flag.String("logxml", "./log/log.xml", "-logxml=./log/log.xml") bindHost := flag.String("bind", ":13800", "-bind=localhost:13800") zkhost := flag.String("zkhost", "localhost:2181", "-zkhost=localhost:2181") topics := flag.String("topics", "", "-topics=trade,a,b") dlqHourPerDay := flag.Int("dlqHourPerDay", 2, "-dlqExecHour=2 过期消息迁移时间点") db := flag.String("db", "memory://initcap=100000&maxcap=200000", "-db=mysql://master:3306,slave:3306?db=kite&username=root&password=root&maxConn=500&batchUpdateSize=1000&batchDelSize=1000&flushSeconds=1000") pprofPort := flag.Int("pport", -1, "pprof port default value is -1 ") clusterName := flag.String("clusterName", "default_dev", "-clusterName=default_dev") configPath := flag.String("configPath", "", "-configPath=conf/cluster.toml kiteq配置的toml文件") flag.Parse() so := ServerOption{} //判断当前采用配置文件加载 if nil != configPath && len(*configPath) > 0 { //解析 err := loadTomlConf(*configPath, *clusterName, *bindHost, *pprofPort, &so) if nil != err { panic("loadTomlConf|FAIL|" + err.Error()) } } else { //采用传参 so.zkhosts = *zkhost so.bindHost = *bindHost so.pprofPort = *pprofPort so.clusterName = DEFAULT_APP so.topics = strings.Split(*topics, ",") so.deliveryFirst = *deliveryFirst so.dlqExecHour = *dlqHourPerDay so.logxml = *logxml so.db = *db so.deliveryTimeout = 5 * time.Second so.maxDeliverWorkers = 8000 so.recoverPeriod = 60 * time.Second } //加载log4go的配置 log.LoadConfiguration(so.logxml) return so }
func main() { logxml := flag.String("logxml", "../log/log_consumer.xml", "-logxml=../log/log_consumer.xml") zkhost := flag.String("zkhost", "localhost:2181", "-zkhost=localhost:2181") flag.Parse() runtime.GOMAXPROCS(8) log.LoadConfiguration(*logxml) go func() { log.Info(http.ListenAndServe(":38000", nil)) }() lis := &defualtListener{} go lis.monitor() kite := client.NewKiteQClient(*zkhost, "s-mts-test", "123456", lis) kite.SetBindings([]*binding.Binding{ binding.Bind_Direct("s-mts-test", "relation", "pay-succ", 1000, true), }) kite.Start() var s = make(chan os.Signal, 1) signal.Notify(s, syscall.SIGKILL, syscall.SIGUSR1) //是否收到kill的命令 for { cmd := <-s if cmd == syscall.SIGKILL { break } else if cmd == syscall.SIGUSR1 { //如果为siguser1则进行dump内存 unixtime := time.Now().Unix() path := "./heapdump-consumer" + fmt.Sprintf("%d", unixtime) f, err := os.Create(path) if nil != err { continue } else { debug.WriteHeapDump(f.Fd()) } } } kite.Destory() }
func main() { logxml := flag.String("logxml", "./log/log_producer.xml", "-logxml=./log/log_producer.xml") k := flag.Int("k", 1, "-k=1 //kiteclient num ") c := flag.Int("c", 1, "-c=100") tx := flag.Bool("tx", false, "-tx=true send Tx Message") zkhost := flag.String("zkhost", "localhost:2181", "-zkhost=localhost:2181") flag.Parse() runtime.GOMAXPROCS(8) log.LoadConfiguration(*logxml) go func() { log.Info(http.ListenAndServe(":28000", nil)) }() count := int32(0) lc := int32(0) fc := int32(0) flc := int32(0) go func() { for { tmp := count ftmp := fc time.Sleep(1 * time.Second) fmt.Printf("tps:%d/%d\n", (tmp - lc), (ftmp - flc)) lc = tmp flc = ftmp } }() wg := &sync.WaitGroup{} stop := false clients := make([]*client.KiteQClient, 0, *k) for j := 0; j < *k; j++ { kiteClient := client.NewKiteQClient(*zkhost, "pb-mts-test", "123456", &defualtListener{}) kiteClient.SetTopics([]string{"trade"}) kiteClient.Start() clients = append(clients, kiteClient) time.Sleep(3 * time.Second) fmt.Printf("Open Client %d\n", j) for i := 0; i < *c; i++ { go func(kite *client.KiteQClient) { wg.Add(1) for !stop { if *tx { msg := buildBytesMessage(false) err := kite.SendTxBytesMessage(msg, doTranscation) if nil != err { fmt.Printf("SEND TxMESSAGE |FAIL|%s\n", err) atomic.AddInt32(&fc, 1) } else { atomic.AddInt32(&count, 1) } } else { txmsg := buildBytesMessage(true) err := kite.SendBytesMessage(txmsg) if nil != err { // fmt.Printf("SEND MESSAGE |FAIL|%s\n", err) atomic.AddInt32(&fc, 1) } else { atomic.AddInt32(&count, 1) } } } wg.Done() }(kiteClient) } time.Sleep(10 * time.Second) } var s = make(chan os.Signal, 1) signal.Notify(s, syscall.SIGKILL, syscall.SIGUSR1) //是否收到kill的命令 for { cmd := <-s if cmd == syscall.SIGKILL { break } else if cmd == syscall.SIGUSR1 { //如果为siguser1则进行dump内存 unixtime := time.Now().Unix() path := "./heapdump-producer" + fmt.Sprintf("%d", unixtime) f, err := os.Create(path) if nil != err { continue } else { debug.WriteHeapDump(f.Fd()) } } } wg.Wait() for _, k := range clients { k.Destory() } }
func main() { fly := flag.Bool("fly", false, "-fly=true //开启服务端优先投递,false为优先存储") logxml := flag.String("logxml", "./log/log.xml", "-logxml=./log/log.xml") bindHost := flag.String("bind", ":13800", "-bind=localhost:13800") zkhost := flag.String("zkhost", "localhost:2181", "-zkhost=localhost:2181") topics := flag.String("topics", "", "-topics=trade,a,b") dlqHourPerDay := flag.Int("dlqHourPerDay", 2, "-dlqExecHour=2 过期消息迁移时间点") db := flag.String("db", "memory://initcap=100000&maxcap=200000", "-db=mysql://master:3306,slave:3306?db=kite&username=root&password=root&maxConn=500&batchUpdateSize=1000&batchDelSize=1000&flushSeconds=1000") pprofPort := flag.Int("pport", -1, "pprof port default value is -1 ") flag.Parse() //加载log4go的配置 log.LoadConfiguration(*logxml) flag.VisitAll(func(f *flag.Flag) { log.InfoLog("kite_server", "KiteQ[%s:%s]", f.Name, f.Value.String()) }) runtime.GOMAXPROCS(runtime.NumCPU()) host, port, _ := net.SplitHostPort(*bindHost) rc := turbo.NewRemotingConfig( "remoting-"+*bindHost, 20000, 16*1024, 16*1024, 10000, 10000, 10*time.Second, 160000) kc := server.NewKiteQConfig("kiteq-"+*bindHost, *bindHost, *zkhost, *fly, 5*time.Second, 8000, 5*time.Second, *dlqHourPerDay /*每天凌晨2点执行*/, strings.Split(*topics, ","), *db, rc) qserver := server.NewKiteQServer(kc) qserver.Start() go func() { if *pprofPort > 0 { http.HandleFunc("/stat", qserver.HandleStat) http.HandleFunc("/binds", qserver.HandleBindings) log.Error(http.ListenAndServe(host+":"+strconv.Itoa(*pprofPort), nil)) } }() var s = make(chan os.Signal, 1) signal.Notify(s, syscall.SIGKILL, syscall.SIGUSR1) //是否收到kill的命令 for { cmd := <-s if cmd == syscall.SIGKILL { break } else if cmd == syscall.SIGUSR1 { //如果为siguser1则进行dump内存 unixtime := time.Now().Unix() path := "./heapdump-kiteq-" + host + "_" + port + fmt.Sprintf("%d", unixtime) f, err := os.Create(path) if nil != err { continue } else { debug.WriteHeapDump(f.Fd()) } } } qserver.Shutdown() log.InfoLog("kite_server", "KiteQServer IS STOPPED!") }