game_sync/worldsrv/init.go

208 lines
5.8 KiB
Go

package main
import (
"fmt"
"math/rand"
"time"
"mongo.games.com/game/common"
"mongo.games.com/game/gamerule/crash"
"mongo.games.com/game/mq"
"mongo.games.com/goserver/core/broker/rabbitmq"
"sync"
"github.com/astaxie/beego/cache"
"mongo.games.com/game/model"
"mongo.games.com/game/webapi"
"mongo.games.com/goserver/core"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/utils"
)
type ParalleFunc func() error
var CacheMemory cache.Cache
var wgParalleLoad = &sync.WaitGroup{}
var ParalleLoadModules []*ParalleLoadModule
var RabbitMQPublisher *mq.RabbitMQPublisher
var RabbitMqConsumer *mq.RabbitMQConsumer
type ParalleLoadModule struct {
name string
f ParalleFunc
}
func RegisterParallelLoadFunc(name string, f ParalleFunc) {
ParalleLoadModules = append(ParalleLoadModules, &ParalleLoadModule{name: name, f: f})
}
func init() {
rand.Seed(time.Now().UnixNano())
//首先加载游戏配置
core.RegisteHook(core.HOOK_BEFORE_START, func() error {
model.StartupRPClient(common.CustomConfig.GetString("MgoRpcCliNet"), common.CustomConfig.GetString("MgoRpcCliAddr"), time.Duration(common.CustomConfig.GetInt("MgoRpcCliReconnInterV"))*time.Second)
model.InitGameParam()
model.InitNormalParam()
hs := model.GetCrashHash(0)
if hs == nil {
for i := 0; i < crash.POKER_CART_CNT; i++ {
model.InsertCrashHash(i, crash.Sha256(fmt.Sprintf("%v%v", i, time.Now().UnixNano())))
}
hs = model.GetCrashHash(0)
}
model.GameParamData.InitGameHash = []string{}
for _, v := range hs {
model.GameParamData.InitGameHash = append(model.GameParamData.InitGameHash, v.Hash)
}
hsatom := model.GetCrashHashAtom(0)
if hsatom == nil {
for i := 0; i < crash.POKER_CART_CNT; i++ {
model.InsertCrashHashAtom(i, crash.Sha256(fmt.Sprintf("%v%v", i, time.Now().UnixNano())))
}
hsatom = model.GetCrashHashAtom(0)
}
model.GameParamData.AtomGameHash = []string{}
for _, v := range hsatom {
model.GameParamData.AtomGameHash = append(model.GameParamData.AtomGameHash, v.Hash)
}
//if len(model.GameParamData.AtomGameHash) < crash.POKER_CART_CNT ||
// len(model.GameParamData.InitGameHash) < crash.POKER_CART_CNT {
// panic(errors.New("hash is read error"))
//}
return nil
})
//RegisterParallelLoadFunc("平台红包数据", func() error {
// actRandCoinMgr.LoadPlatformData()
// return nil
//})
RegisterParallelLoadFunc("GMAC", func() error {
model.InitGMAC()
return nil
})
RegisterParallelLoadFunc("三方游戏配置", func() error {
model.InitGameConfig()
return nil
})
RegisterParallelLoadFunc("GameKVData", func() error {
model.InitGameKVData()
return nil
})
RegisterParallelLoadFunc("水池配置", func() error {
return model.GetAllCoinPoolSettingData()
})
RegisterParallelLoadFunc("三方平台热载数据设置", func() error {
f := func() {
webapi.ReqCgAddr = model.GameParamData.CgAddr
if plt, ok := webapi.ThridPlatformMgrSington.ThridPlatformMap.Load("XHJ平台"); ok {
//plt.(*webapi.XHJThridPlatform).IsNeedCheckQuota = model.GameParamData.FGCheckPlatformQuota
plt.(*webapi.XHJThridPlatform).ReqTimeOut = model.GameParamData.ThirdPltReqTimeout
}
}
f()
model.GameParamData.Observers = append(model.GameParamData.Observers, f)
return nil
})
core.RegisteHook(core.HOOK_BEFORE_START, func() error {
//for _, v := range data {
// PlatformMgrSingleton.UpsertPlatform(v.Name, v.Isolated, v.GameStatesData)
//}
//ps := []model.GamePlatformState{model.GamePlatformState{LogicId:130000001,Param:"",State:1},model.GamePlatformState{LogicId:150000001,Param:"",State:1}}
//model.InsertPlatformGameConfig("360",true,ps)
var err error
CacheMemory, err = cache.NewCache("memory", `{"interval":60}`)
if err != nil {
return err
}
//etcd打开连接
EtcdMgrSington.Init()
//go func() {
// for {
// time.Sleep(time.Minute)
// EtcdMgrSington.Reset()
// }
//}()
//rabbitmq打开链接
RabbitMQPublisher = mq.NewRabbitMQPublisher(common.CustomConfig.GetString("RabbitMQURL"), rabbitmq.Exchange{Name: common.CustomConfig.GetString("RMQExchange"), Durable: true}, common.CustomConfig.GetInt("RMQPublishBacklog"))
if RabbitMQPublisher != nil {
err = RabbitMQPublisher.Start()
if err != nil {
panic(err)
}
}
RabbitMqConsumer = mq.NewRabbitMQConsumer(common.CustomConfig.GetString("RabbitMQURL"), rabbitmq.Exchange{Name: common.CustomConfig.GetString("RMQExchange"), Durable: true})
if RabbitMqConsumer != nil {
RabbitMqConsumer.Start()
}
//开始并行加载数据
//改为串行加载,后台并发有点扛不住
if len(ParalleLoadModules) > 0 {
tStart := time.Now()
logger.Logger.Infof("===[开始串行加载]===")
//wgParalleLoad.Add(paralleCnt)
for _, m := range ParalleLoadModules {
/*go*/ func(plm *ParalleLoadModule) {
ts := time.Now()
defer func() {
utils.DumpStackIfPanic(plm.name)
//wgParalleLoad.Done()
logger.Logger.Infof("[串行加载结束][%v] 耗时[%v]", plm.name, time.Now().Sub(ts))
}()
logger.Logger.Infof("[开始串行加载][%v] ", plm.name)
err := plm.f()
if err != nil {
logger.Logger.Warnf("[串行加载][%v][error:%v]", plm.name, err)
}
}(m)
}
//wgParalleLoad.Wait()
logger.Logger.Infof("===[串行加载结束,总耗时:%v]===", time.Now().Sub(tStart))
}
return nil
})
core.RegisteHook(core.HOOK_AFTER_STOP, func() error {
//etcd关闭连接
EtcdMgrSington.Shutdown()
//关闭rabbitmq连接
if RabbitMQPublisher != nil {
RabbitMQPublisher.Stop()
}
if RabbitMqConsumer != nil {
RabbitMqConsumer.Stop()
}
//model.ShutdownRPClient()
return nil
})
//core.RegisteHook(core.HOOK_BEFORE_START, func() error {
// ThirdPltGameMappingConfig.Init()
// return nil
//})
//RegisterParallelLoadFunc("分层配置数据", func() error {
// //加载分层配置
// LogicLevelMgrSington.LoadConfig()
// return nil
//})
}