--------------------------------------------- -- 活动跨服分配 --------------------------------------------- local LuaMongo = _G.lua_mongo local DB = require("common.DB") local Util = require("common.Util") local InnerMsg = require("core.InnerMsg") local MiddleManager = require("middle.MiddleManager") ACTID_2_SVRGROUP = ACTID_2_SVRGROUP or {} -- 活动Id->分组信息 ACTID_2_GOURPLIST = ACTID_2_GOURPLIST or {} -- [actID][groupID] = list -- 活动ID ACTID1 = 1 -- -- X个服务器分为一组 ACTID_2_SVRNUM = { [ACTID1] = 100, } function cleanSvrGroup(actID) ACTID_2_SVRGROUP[actID] = nil ACTID_2_GOURPLIST[actID] = nil end function getMiddleSvrNum(actID) return ACTID_2_SVRNUM[actID] or 3 end function getActGroupInfo(actID) local groupInfo = {} groupInfo.svrGroup = ACTID_2_SVRGROUP[actID] groupInfo.groupList = ACTID_2_GOURPLIST[actID] return groupInfo end function setActGroupInfo(actID, groupInfo) ACTID_2_SVRGROUP[actID] = groupInfo and groupInfo.svrGroup ACTID_2_GOURPLIST[actID] = groupInfo and groupInfo.groupList end function initSvrGroup(actID) ACTID_2_SVRGROUP[actID] = {} ACTID_2_GOURPLIST[actID] = {} local svrGroup = ACTID_2_SVRGROUP[actID] local groups = ACTID_2_GOURPLIST[actID] local num = getMiddleSvrNum(actID) local cnt = 0 local groupID = 1 for svrIndex in Util.pairsByKeys(MiddleManager.SVRINDEX_2_FD) do if cnt >= num then cnt = 0 groupID = groupID + 1 end cnt = cnt + 1 svrGroup[svrIndex] = groupID groups[groupID] = groups[groupID] or {} groups[groupID][cnt] = svrIndex end svrGroup.cnt = cnt svrGroup.groupID = groupID return svrGroup end local function addSvrGroup(actID, svrIndex) local svrGroup = ACTID_2_SVRGROUP[actID] if svrGroup[svrIndex] then return end local groups = ACTID_2_GOURPLIST[actID] local num = getMiddleSvrNum(actID) local cnt = svrGroup.cnt local groupID = svrGroup.groupID if cnt >= num then cnt = 0 groupID = groupID + 1 end cnt = cnt + 1 svrGroup[svrIndex] = groupID svrGroup.cnt = cnt svrGroup.groupID = groupID groups[groupID] = groups[groupID] or {} groups[groupID][cnt] = svrIndex end function getSvrGroup(actID, svrIndex) if not svrIndex then return end local realSvrIndex = MiddleManager.getLastSvrIndex(svrIndex) if not realSvrIndex then return end local isChange = nil if not ACTID_2_SVRGROUP[actID] then initSvrGroup(actID) isChange = true end local svrGroup = ACTID_2_SVRGROUP[actID] if not svrGroup[realSvrIndex] then addSvrGroup(actID, realSvrIndex) isChange = true end if isChange == true then updateDB(actID) end return svrGroup[realSvrIndex], isChange end -- 根据活动和分组id获得服务器列表 function getSvrListByID(actID, groupID) local groups = ACTID_2_GOURPLIST[actID] if not groups then return end return groups[groupID] end -- 发送到分组 function send2Group(msg, actID, groupID, noSvrIndex) if not _G.is_middle then return end local svrList = getSvrListByID(actID, groupID) if not svrList then return end for _, svrIndex in ipairs(svrList) do local fd = MiddleManager.getFDBySvrIndex(svrIndex) local noFd = MiddleManager.getFDBySvrIndex(noSvrIndex) if fd and fd ~= noFd then InnerMsg.sendMsg(fd, msg) end end end function initAfterStart() if not _G.is_middle then return end print("initAfterStart") LuaMongo.find(DB.db_middle_act_group) local groupData = {} if LuaMongo.next(groupData) then for k, v in pairs(ACTID_2_SVRNUM) do setActGroupInfo(k, groupData[k]) end else LuaMongo.insert(DB.db_middle_act_group, groupData) end end local query = {} function updateDB(actID) if not _G.is_middle then return end if ACTID_2_SVRNUM[actID] == nil then assert(nil) end LuaMongo.find(DB.db_middle_act_group) local groupData = {} if LuaMongo.next(groupData) then groupData[actID] = groupData[actID] or {} groupData[actID].svrGroup = ACTID_2_SVRGROUP[actID] groupData[actID].groupList = ACTID_2_GOURPLIST[actID] query._id = groupData._id LuaMongo.update(DB.db_middle_act_group, query, groupData) end end