gamemgr.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. pb "bet24.com/servers/micros/game/proto"
  5. level "bet24.com/servers/micros/userservices/proto"
  6. "encoding/json"
  7. "sync"
  8. "time"
  9. )
  10. const timeout = 300 // 5分钟
  11. type gamemgr struct {
  12. lock *sync.RWMutex
  13. list []*pb.GameAddrInfo
  14. }
  15. func newGameMgr() *gamemgr {
  16. mgr = &gamemgr{}
  17. mgr.lock = &sync.RWMutex{}
  18. go mgr.checkRefresh()
  19. return mgr
  20. }
  21. func (this *gamemgr) checkRefresh() {
  22. ticker := time.NewTicker(10 * time.Second)
  23. go func(t *time.Ticker) {
  24. for {
  25. select {
  26. case <-t.C:
  27. this.checkTimeOut()
  28. }
  29. }
  30. }(ticker)
  31. }
  32. // 检查过期
  33. func (this *gamemgr) checkTimeOut() {
  34. this.lock.Lock()
  35. defer this.lock.Unlock()
  36. for idx, val := range this.list {
  37. if time.Now().Unix()-val.Ts >= timeout {
  38. this.list = append(this.list[:idx], this.list[idx+1:]...)
  39. continue
  40. }
  41. }
  42. }
  43. // 轮询
  44. func (this *gamemgr) polling(addr string, players int) {
  45. if addr == "" {
  46. return
  47. }
  48. this.lock.Lock()
  49. defer this.lock.Unlock()
  50. for _, v := range this.list {
  51. if v.Addr != addr {
  52. continue
  53. }
  54. v.Players = players
  55. v.Ts = time.Now().Unix()
  56. return
  57. }
  58. this.list = append(this.list, &pb.GameAddrInfo{
  59. Addr: addr,
  60. Players: players,
  61. Ts: time.Now().Unix(),
  62. })
  63. return
  64. }
  65. // 获取地址
  66. func (this *gamemgr) getAddr(userId int) string {
  67. // 判断是否显示游戏大厅
  68. if !level.IsShowGameHall(userId) {
  69. return ""
  70. }
  71. this.lock.RLock()
  72. defer this.lock.RUnlock()
  73. for _, v := range this.list {
  74. // 后期加负载均衡算法
  75. return v.Addr
  76. }
  77. return ""
  78. }
  79. func (this *gamemgr) dumpSys(param string) {
  80. log.Release("-------------------------------")
  81. log.Release("gamemgr.dumpSys %s", param)
  82. defer func() {
  83. log.Release("+++++++++++++++++++++++++++++++")
  84. log.Release("")
  85. }()
  86. d, _ := json.Marshal(this.list)
  87. log.Release(string(d))
  88. }