| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package handler
- import (
- "bet24.com/log"
- pb "bet24.com/servers/micros/game/proto"
- level "bet24.com/servers/micros/userservices/proto"
- "encoding/json"
- "sync"
- "time"
- )
- const timeout = 300 // 5分钟
- type gamemgr struct {
- lock *sync.RWMutex
- list []*pb.GameAddrInfo
- }
- func newGameMgr() *gamemgr {
- mgr = &gamemgr{}
- mgr.lock = &sync.RWMutex{}
- go mgr.checkRefresh()
- return mgr
- }
- func (this *gamemgr) checkRefresh() {
- ticker := time.NewTicker(10 * time.Second)
- go func(t *time.Ticker) {
- for {
- select {
- case <-t.C:
- this.checkTimeOut()
- }
- }
- }(ticker)
- }
- // 检查过期
- func (this *gamemgr) checkTimeOut() {
- this.lock.Lock()
- defer this.lock.Unlock()
- for idx, val := range this.list {
- if time.Now().Unix()-val.Ts >= timeout {
- this.list = append(this.list[:idx], this.list[idx+1:]...)
- continue
- }
- }
- }
- // 轮询
- func (this *gamemgr) polling(addr string, players int) {
- if addr == "" {
- return
- }
- this.lock.Lock()
- defer this.lock.Unlock()
- for _, v := range this.list {
- if v.Addr != addr {
- continue
- }
- v.Players = players
- v.Ts = time.Now().Unix()
- return
- }
- this.list = append(this.list, &pb.GameAddrInfo{
- Addr: addr,
- Players: players,
- Ts: time.Now().Unix(),
- })
- return
- }
- // 获取地址
- func (this *gamemgr) getAddr(userId int) string {
- // 判断是否显示游戏大厅
- if !level.IsShowGameHall(userId) {
- return ""
- }
- this.lock.RLock()
- defer this.lock.RUnlock()
- for _, v := range this.list {
- // 后期加负载均衡算法
- return v.Addr
- }
- return ""
- }
- func (this *gamemgr) dumpSys(param string) {
- log.Release("-------------------------------")
- log.Release("gamemgr.dumpSys %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- d, _ := json.Marshal(this.list)
- log.Release(string(d))
- }
|