MiddleActGroup.lua 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. ---------------------------------------------
  2. -- 活动跨服分配
  3. ---------------------------------------------
  4. local LuaMongo = _G.lua_mongo
  5. local DB = require("common.DB")
  6. local Util = require("common.Util")
  7. local InnerMsg = require("core.InnerMsg")
  8. local MiddleManager = require("middle.MiddleManager")
  9. ACTID_2_SVRGROUP = ACTID_2_SVRGROUP or {} -- 活动Id->分组信息
  10. ACTID_2_GOURPLIST = ACTID_2_GOURPLIST or {} -- [actID][groupID] = list
  11. -- 活动ID
  12. ACTID1 = 1 --
  13. -- X个服务器分为一组
  14. ACTID_2_SVRNUM = {
  15. [ACTID1] = 100,
  16. }
  17. function cleanSvrGroup(actID)
  18. ACTID_2_SVRGROUP[actID] = nil
  19. ACTID_2_GOURPLIST[actID] = nil
  20. end
  21. function getMiddleSvrNum(actID)
  22. return ACTID_2_SVRNUM[actID] or 3
  23. end
  24. function getActGroupInfo(actID)
  25. local groupInfo = {}
  26. groupInfo.svrGroup = ACTID_2_SVRGROUP[actID]
  27. groupInfo.groupList = ACTID_2_GOURPLIST[actID]
  28. return groupInfo
  29. end
  30. function setActGroupInfo(actID, groupInfo)
  31. ACTID_2_SVRGROUP[actID] = groupInfo and groupInfo.svrGroup
  32. ACTID_2_GOURPLIST[actID] = groupInfo and groupInfo.groupList
  33. end
  34. function initSvrGroup(actID)
  35. ACTID_2_SVRGROUP[actID] = {}
  36. ACTID_2_GOURPLIST[actID] = {}
  37. local svrGroup = ACTID_2_SVRGROUP[actID]
  38. local groups = ACTID_2_GOURPLIST[actID]
  39. local num = getMiddleSvrNum(actID)
  40. local cnt = 0
  41. local groupID = 1
  42. for svrIndex in Util.pairsByKeys(MiddleManager.SVRINDEX_2_FD) do
  43. if cnt >= num then
  44. cnt = 0
  45. groupID = groupID + 1
  46. end
  47. cnt = cnt + 1
  48. svrGroup[svrIndex] = groupID
  49. groups[groupID] = groups[groupID] or {}
  50. groups[groupID][cnt] = svrIndex
  51. end
  52. svrGroup.cnt = cnt
  53. svrGroup.groupID = groupID
  54. return svrGroup
  55. end
  56. local function addSvrGroup(actID, svrIndex)
  57. local svrGroup = ACTID_2_SVRGROUP[actID]
  58. if svrGroup[svrIndex] then
  59. return
  60. end
  61. local groups = ACTID_2_GOURPLIST[actID]
  62. local num = getMiddleSvrNum(actID)
  63. local cnt = svrGroup.cnt
  64. local groupID = svrGroup.groupID
  65. if cnt >= num then
  66. cnt = 0
  67. groupID = groupID + 1
  68. end
  69. cnt = cnt + 1
  70. svrGroup[svrIndex] = groupID
  71. svrGroup.cnt = cnt
  72. svrGroup.groupID = groupID
  73. groups[groupID] = groups[groupID] or {}
  74. groups[groupID][cnt] = svrIndex
  75. end
  76. function getSvrGroup(actID, svrIndex)
  77. if not svrIndex then return end
  78. local realSvrIndex = MiddleManager.getLastSvrIndex(svrIndex)
  79. if not realSvrIndex then return end
  80. local isChange = nil
  81. if not ACTID_2_SVRGROUP[actID] then
  82. initSvrGroup(actID)
  83. isChange = true
  84. end
  85. local svrGroup = ACTID_2_SVRGROUP[actID]
  86. if not svrGroup[realSvrIndex] then
  87. addSvrGroup(actID, realSvrIndex)
  88. isChange = true
  89. end
  90. if isChange == true then
  91. updateDB(actID)
  92. end
  93. return svrGroup[realSvrIndex], isChange
  94. end
  95. -- 根据活动和分组id获得服务器列表
  96. function getSvrListByID(actID, groupID)
  97. local groups = ACTID_2_GOURPLIST[actID]
  98. if not groups then return end
  99. return groups[groupID]
  100. end
  101. -- 发送到分组
  102. function send2Group(msg, actID, groupID, noSvrIndex)
  103. if not _G.is_middle then return end
  104. local svrList = getSvrListByID(actID, groupID)
  105. if not svrList then return end
  106. for _, svrIndex in ipairs(svrList) do
  107. local fd = MiddleManager.getFDBySvrIndex(svrIndex)
  108. local noFd = MiddleManager.getFDBySvrIndex(noSvrIndex)
  109. if fd and fd ~= noFd then
  110. InnerMsg.sendMsg(fd, msg)
  111. end
  112. end
  113. end
  114. function initAfterStart()
  115. if not _G.is_middle then return end
  116. print("initAfterStart")
  117. LuaMongo.find(DB.db_middle_act_group)
  118. local groupData = {}
  119. if LuaMongo.next(groupData) then
  120. for k, v in pairs(ACTID_2_SVRNUM) do
  121. setActGroupInfo(k, groupData[k])
  122. end
  123. else
  124. LuaMongo.insert(DB.db_middle_act_group, groupData)
  125. end
  126. end
  127. local query = {}
  128. function updateDB(actID)
  129. if not _G.is_middle then return end
  130. if ACTID_2_SVRNUM[actID] == nil then
  131. assert(nil)
  132. end
  133. LuaMongo.find(DB.db_middle_act_group)
  134. local groupData = {}
  135. if LuaMongo.next(groupData) then
  136. groupData[actID] = groupData[actID] or {}
  137. groupData[actID].svrGroup = ACTID_2_SVRGROUP[actID]
  138. groupData[actID].groupList = ACTID_2_GOURPLIST[actID]
  139. query._id = groupData._id
  140. LuaMongo.update(DB.db_middle_act_group, query, groupData)
  141. end
  142. end