From e1d2b4b3491d376623dad96cf3fc3b1ee183f587 Mon Sep 17 00:00:00 2001 From: luying Date: Wed, 26 Apr 2023 09:54:55 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20perf(dispatch):=20=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BD=BF=E7=94=A8redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/gate/handler/gateHandler.ts | 5 +- .../guild/handler/cityActivityHandler.ts | 10 +-- .../guild/handler/raceActivityHandler.ts | 5 +- game-server/app/services/connectorService.ts | 20 +++--- .../guildActivity/guildActivityService.ts | 12 ++-- .../app/services/gvg/gvgBattleMemory.ts | 5 +- .../app/services/gvg/gvgBattleService.ts | 4 +- game-server/app/services/refreshService.ts | 5 +- game-server/app/services/timeTaskService.ts | 8 +-- game-server/app/util/dispatcher.ts | 66 ------------------- game-server/app/util/routeUtil.ts | 35 +++++----- shared/pubUtils/dispatcher.ts | 44 +++---------- web-server/app/controller/game.ts | 2 +- 13 files changed, 67 insertions(+), 154 deletions(-) delete mode 100644 game-server/app/util/dispatcher.ts diff --git a/game-server/app/servers/gate/handler/gateHandler.ts b/game-server/app/servers/gate/handler/gateHandler.ts index 20472c80e..088073bee 100644 --- a/game-server/app/servers/gate/handler/gateHandler.ts +++ b/game-server/app/servers/gate/handler/gateHandler.ts @@ -1,7 +1,8 @@ import { STATUS } from './../../../consts/statusCode'; -import { dispatch } from '../../../util/dispatcher'; +import { dispatch } from '../../../pubUtils/dispatcher'; import { Application, BackendSession, HandlerService, pinus, } from 'pinus'; import { resResult } from '../../../pubUtils/util'; +import { redisClient } from '../../../services/redisService'; export default function (app: Application) { new HandlerService(app, {}); @@ -31,7 +32,7 @@ export class GateHandler { return resResult(STATUS.CONNECTOR_ERR); } // select connector - let res = dispatch(userCode, connectors, 'connector'); + let res = await dispatch(redisClient(), userCode, connectors, 'connector'); return resResult(STATUS.SUCCESS, { host: res.clientHost, port: res.clientPort }); } } \ No newline at end of file diff --git a/game-server/app/servers/guild/handler/cityActivityHandler.ts b/game-server/app/servers/guild/handler/cityActivityHandler.ts index 8fe1b96ab..fe040e73b 100644 --- a/game-server/app/servers/guild/handler/cityActivityHandler.ts +++ b/game-server/app/servers/guild/handler/cityActivityHandler.ts @@ -13,13 +13,13 @@ import { getGoldObject, handleCost } from "../../../services/role/rewardService" import { Rank } from "../../../services/rankService"; import { checkTask } from "../../../services/task/taskService"; import { guildInter } from "../../../pubUtils/interface"; -import { dispatch } from "../../../util/dispatcher"; +import { dispatch } from "../../../pubUtils/dispatcher"; import { ServerRecordModel } from "../../../db/ServerRecords"; import { sendMessageToCityWithSuc } from "../../../services/pushService"; import { isDebugTime } from "../../../pubUtils/sdkUtil"; import { GuildActivityCityDeclareModel } from "../../../db/GuildActivityCityDeclare"; import { GuildModel } from "../../../db/Guild"; -import { getHistoryCity, setHistoryCity } from "../../../services/redisService"; +import { getHistoryCity, redisClient, setHistoryCity } from "../../../services/redisService"; import { HeroModel } from "../../../db/Hero"; export default function (app: Application) { @@ -274,7 +274,7 @@ export class CityActivityHandler { let challengeTime = nowSeconds() + GUILDACTIVITY.CITYACTIVITY_CHALLENGE_CD; if(isDebugTime()) { let guilds = pinus.app.getServersByType('guild'); - let guild = dispatch(roleId, guilds, 'guild'); + let guild = await dispatch(redisClient(), roleId, guilds, 'guild'); let currentTime = await pinus.app.rpc.guild.guildActivityRemote.getCurrentTime.toServer(guild.id); challengeTime = Math.floor(currentTime/1000) + GUILDACTIVITY.CITYACTIVITY_CHALLENGE_CD; } @@ -331,7 +331,7 @@ export class CityActivityHandler { let challengeTime = nowSeconds() + GUILDACTIVITY.CITYACTIVITY_CHALLENGE_CD; if(isDebugTime()) { let guilds = pinus.app.getServersByType('guild'); - let guild = dispatch(roleId, guilds, 'guild'); + let guild = await dispatch(redisClient(), roleId, guilds, 'guild'); let currentTime = await pinus.app.rpc.guild.guildActivityRemote.getCurrentTime.toServer(guild.id); challengeTime = Math.floor(currentTime/1000) + GUILDACTIVITY.CITYACTIVITY_CHALLENGE_CD; } @@ -388,7 +388,7 @@ export class CityActivityHandler { let fun = async () => { for(let [cityId] of gameData.cityActivity) { let guilds = pinus.app.getServersByType('guild'); - let guild = dispatch(`${cityId}`, guilds); + let guild = await dispatch(redisClient(), `${cityId}`, guilds, 'guild'); await pinus.app.rpc.guild.guildActivityRemote.debugSendGateHp.toServer(guild.id, serverId, cityId); } await pinus.app.rpc.guild.guildActivityRemote.sendRankToGuilds.broadcast(this.aid); diff --git a/game-server/app/servers/guild/handler/raceActivityHandler.ts b/game-server/app/servers/guild/handler/raceActivityHandler.ts index 6d472f83e..e0d506f09 100644 --- a/game-server/app/servers/guild/handler/raceActivityHandler.ts +++ b/game-server/app/servers/guild/handler/raceActivityHandler.ts @@ -12,7 +12,8 @@ import { sendMessageToGuildWithSuc } from "../../../services/pushService"; import { RaceActivityRankParam } from "../../../domain/battleField/guildActivity"; import { GuildRankInfo } from "../../../domain/rank"; import { ServerlistModel } from "../../../db/Serverlist"; -import { dispatch } from "../../../util/dispatcher"; +import { dispatch } from "../../../pubUtils/dispatcher"; +import { redisClient } from "../../../services/redisService"; export default function (app: Application) { new HandlerService(app, {}); @@ -259,7 +260,7 @@ export class RaceActivityHandler { if(statusResult.status != GUILD_ACTIVITY_STATUS.START) return resResult(STATUS.GUILD_ACTIVITY_NOT_OPEN); let guild = pinus.app.getServersByType('guild'); - let sid = dispatch(`${serverId}`, guild); + let sid = await dispatch(redisClient(), `${serverId}`, guild, 'guild'); pinus.app.rpc.guild.guildActivityRemote.debugAddHorse.toServer(sid.id, serverId, guildCode, memberCnt, itemInterval) return resResult(STATUS.SUCCESS); diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 8c349178e..1e0110003 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -31,7 +31,7 @@ import { getBattleListOfMain, getMainChapter } from './normalBattleService'; import { GuildModel, GuildType } from '../db/Guild'; import UserGuild, { UserGuildType } from '../db/UserGuild'; import { getAllGuildActivityStatus } from './guildActivity/guildActivityService'; -import { getAllOnlineRoles, getAllServers, incConnectorNum } from './redisService'; +import { getAllOnlineRoles, getAllServers, incConnectorNum, redisClient } from './redisService'; import Item, { ItemModel } from '../db/Item'; import { PvpDefenseModel } from '../db/PvpDefense'; import { getDonation } from './donateService'; @@ -47,7 +47,7 @@ import { getSurvey } from './gmService'; import { ComBattleTeamModel } from '../db/ComBattleTeam'; import { INFO_WINDOW } from '../pubUtils/dicParam'; import { getLadderData } from './ladderService'; -import { dispatch } from '../util/dispatcher'; +import { dispatch } from '../pubUtils/dispatcher'; import { PvpDataReturn } from '../domain/battleField/pvp'; import { getHiddenData } from './dataService'; import { ArtifactModel } from '../db/Artifact'; @@ -349,12 +349,12 @@ export async function kickUser(app: Application, uid: string, message = STATUS.L export async function assignServer(roleId: string, session: FrontendOrBackendSession) { try { - let activity = _assignServer(roleId, 'activity'); - let battle = _assignServer(roleId, 'battle'); - let chat = _assignServer(roleId, 'chat'); - let guild = _assignServer(roleId, 'guild'); - let role = _assignServer(roleId, 'role'); - let order = _assignServer(roleId, 'order'); + let activity = await _assignServer(roleId, 'activity'); + let battle = await _assignServer(roleId, 'battle'); + let chat = await _assignServer(roleId, 'chat'); + let guild = await _assignServer(roleId, 'guild'); + let role = await _assignServer(roleId, 'role'); + let order = await _assignServer(roleId, 'order'); if(activity) { session.set('activityServer', activity); session.push('activityServer', () => { }); @@ -384,7 +384,7 @@ export async function assignServer(roleId: string, session: FrontendOrBackendSes } } -function _assignServer(roleId: string, serverType: string) { +async function _assignServer(roleId: string, serverType: string) { let servers = pinus.app.getServersByType(serverType)||[]; let sum = servers.reduce((pre, cur) => pre + (cur['num']||0), 0); let id = ''; @@ -394,7 +394,7 @@ function _assignServer(roleId: string, serverType: string) { id = server?.id; } if(!id) { - id = dispatch(roleId, servers, serverType)?.id; + id = (await dispatch(redisClient(), roleId, servers, serverType))?.id; } return id } diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index 223c618b5..54d6ff227 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -7,7 +7,7 @@ import { GUILD_ACTIVITY_STATUS, GET_POINT_WAYS, GUILD_ACTIVITY_TYPE, REDIS_KEY, import { Record, UserGuildActivityRecModel } from "../../db/UserGuildActivityRec"; import { GateMembersRec, CityParam, WoodenHorse, RaceActivityRankParam } from "../../domain/battleField/guildActivity"; import { DicGuildActivity } from "../../pubUtils/dictionary/DicGuildActivity"; -import { getAllServers, getRoleOnlineInfo } from "../redisService"; +import { getAllServers, getRoleOnlineInfo, redisClient } from "../redisService"; import { SimpleGuildRankParam, SimpleRoleRankParam, GuildRankInfo, RoleRankInfo } from "../../domain/rank"; import { pinus } from "pinus"; import { GuildActivityRecordModel } from "../../db/GuildActivityRec"; @@ -32,7 +32,7 @@ import { getRandSingleEelm } from "../../pubUtils/util"; import { CounterModel } from "../../db/Counter"; import { setInterval } from "timers"; import { DicRaceActivity } from "../../pubUtils/dictionary/DicRaceActivity"; -import { dispatch } from "../../util/dispatcher"; +import { dispatch } from "../../pubUtils/dispatcher"; import { GuildModel } from "../../db/Guild"; let gateActivityObj: GateActivityObject; @@ -897,7 +897,7 @@ export async function resetJoinWoodenHorse() { let guild = pinus.app.getServersByType('guild'); let recs = await GuildActivityRecordModel.findRecs(GUILD_ACTIVITY_TYPE.RACE_ACTIVITY, joinIndex); for(let { serverId, guildCode, joinMember } of recs) { - let server = dispatch(`${serverId}`, guild); + let server = await dispatch(redisClient(), `${serverId}`, guild, 'guild'); if(server.id != pinus.app.getServerId()) continue; for(let { roleId, roleName, job, code} of joinMember) { @@ -954,7 +954,7 @@ export async function leaveRaceActivity(serverId: number, guildCode: string, rol export async function leaveRaceActivityToRemote(serverId: number, guildCode: string, roleId: string) { let guildServers = pinus.app.getServersByType('guild')||[]; - let server = dispatch(`${serverId}`, guildServers); + let server = await dispatch(redisClient(), `${serverId}`, guildServers, 'guild'); if(server) { await pinus.app.rpc.guild.guildActivityRemote.leaveRaceActivity.toServer(server.id, serverId, guildCode, roleId); } @@ -970,7 +970,7 @@ export async function leaveRaceWhenQuitGuild(serverId: number, guildCode: string export async function leaveRaceWhenQuitGuildToRemote(serverId: number, guildCode: string, roleId: string) { let guildServers = pinus.app.getServersByType('guild')||[]; - let server = dispatch(`${serverId}`, guildServers); + let server = await dispatch(redisClient(), `${serverId}`, guildServers, 'guild'); if(server) { await pinus.app.rpc.guild.guildActivityRemote.leaveRaceWhenQuitGuild.toServer(server.id, serverId, guildCode, roleId); } @@ -986,7 +986,7 @@ export async function leaveRaceWhenDismiss(guildCode: string, serverId: number) export async function leaveRaceWhenDismissToRemote(serverId: number, guildCode: string) { let guildServers = pinus.app.getServersByType('guild')||[]; - let server = dispatch(`${serverId}`, guildServers); + let server = await dispatch(redisClient(), `${serverId}`, guildServers, 'guild'); if(server) { await pinus.app.rpc.guild.guildActivityRemote.leaveRaceWhenDismiss.toServer(server.id, guildCode, serverId); } diff --git a/game-server/app/services/gvg/gvgBattleMemory.ts b/game-server/app/services/gvg/gvgBattleMemory.ts index 074e8deae..3f229a35e 100644 --- a/game-server/app/services/gvg/gvgBattleMemory.ts +++ b/game-server/app/services/gvg/gvgBattleMemory.ts @@ -4,8 +4,9 @@ import { pinus } from "pinus"; import { GVG_CATAPULT, GVG_PERIOD } from "../../consts"; import { GVGTeamModel, GVGTeamType } from "../../db/GVGTeam"; import { GVGTeamMem } from "../../domain/battleField/gvgBattle"; -import { dispatch } from "../../util/dispatcher"; +import { dispatch } from "../../pubUtils/dispatcher"; import { getGVGPeriodData } from "./gvgService"; +import { redisClient } from "../redisService"; // 积分点占领情况,groupId_serverType_cityId -> GVGBattleData const gvgBattleMap: Map = new Map(); @@ -244,7 +245,7 @@ export async function initTeamToMem() { let teams = await GVGTeamModel.findByConfigId(configId); for(let team of teams) { if(team.isBroken) continue; - if(dispatch(team.cityId.toString(), servers)?.id == sid) { + if((await dispatch(redisClient(), team.cityId.toString(), servers, 'guild'))?.id == sid) { let teamObj = getGVGBattleData(team.groupKey); teamObj.enterCity(team); } diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 9a7d1e9a1..6d2805758 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -13,7 +13,7 @@ import { GVGHeroInfo, PvpEnemies, PvpHeroInfo } from "../../domain/dbGeneral"; import { getGroupKey, getGVGConfig, getGVGConfigFromRemote, getGVGPeriodData } from "./gvgService"; import { GVGLeaguePrepareModel } from "../../db/GVGLeaguePrepare"; import { pinus } from "pinus"; -import { dispatch } from "../../util/dispatcher"; +import { dispatch } from "../../pubUtils/dispatcher"; import { Rank } from "../rankService"; import { KeyNameParam, LeagueRankInfo, myIdInter, RoleRankInfo } from "../../domain/rank"; import { findKeys, getAllServerName, redisClient } from "../redisService"; @@ -358,7 +358,7 @@ export async function gvgBattleStart() { let { configId } = getGVGConfig(); let guardCities = await GVGCityModel.findAllGuardCities(configId); for(let { cityId, groupKey, guardLeague, guardLeagueName } of guardCities) { - let sid = dispatch(cityId.toString(), servers)?.id; + let sid = (await dispatch(redisClient(), cityId.toString(), servers, 'guild'))?.id; await pinus.app.rpc.guild.guildRemote.initCatapult.toServer(sid, cityId, groupKey, guardLeague, guardLeagueName); } } diff --git a/game-server/app/services/refreshService.ts b/game-server/app/services/refreshService.ts index 0c179d742..e979a4f8f 100644 --- a/game-server/app/services/refreshService.ts +++ b/game-server/app/services/refreshService.ts @@ -2,10 +2,11 @@ import { FrontendOrBackendSession, pinus } from "pinus"; import { shouldRefresh, shouldRefreshWeek } from '../pubUtils/util'; import { nowSeconds } from "../pubUtils/timeUtil"; import { refDailyTask, refDailyTaskBox } from './task/taskService' -import { dispatch } from "../util/dispatcher"; +import { dispatch } from "../pubUtils/dispatcher"; import { sendMessageToUserWithSuc } from "./pushService"; import { PUSH_ROUTE } from "../consts"; import { isDebugTime } from "../pubUtils/sdkUtil"; +import { redisClient } from "./redisService"; /** * 刷新 @@ -19,7 +20,7 @@ export async function refresh(session: FrontendOrBackendSession) { sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PUSH_CURRENT_TIME, { time: Date.now() }, sid); } else { let guilds = pinus.app.getServersByType('guild'); - let guild = dispatch(roleId, guilds, 'guild'); + let guild = await dispatch(redisClient(), roleId, guilds, 'guild'); let currentTime = await pinus.app.rpc.guild.guildActivityRemote.getCurrentTime.toServer(guild.id); sendMessageToUserWithSuc(roleId, PUSH_ROUTE.PUSH_CURRENT_TIME, { time: currentTime }, sid); } diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 9b8e82aec..33bcf9438 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -4,7 +4,7 @@ import { PVPConfigModel, PVPConfigType } from '../db/PvpConfig'; import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil'; import { getTodayGuildActivity, gameData } from '../pubUtils/data'; import { pvpSeasonEnd } from './pvpService'; -import { getAllOnlineRoles, getAllServers, delGuildActivityRank, getServerCreateTime } from './redisService'; +import { getAllOnlineRoles, getAllServers, delGuildActivityRank, getServerCreateTime, redisClient } from './redisService'; import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE, PUSH_ROUTE, STATUS, LADDER_STATUS, LADDER_SERVER_GAP_TIME, GVG_PERIOD, SDK_PUSH_MSG_TYPE, MAIL_TYPE } from '../consts'; import { pinus } from 'pinus'; import { settleGuildWeekly } from './guildService'; @@ -12,7 +12,7 @@ import { sendMailByContent, SendMailFun, sendMailsByGmMail, } from './mailServic import { sendEndMsgToAllServer, sendGuildActivityStatus, setPreDayActiveData, incCurGuildActivityIndex } from './guildActivity/guildActivityService'; import { sendUngotDividendJob, startGuildAuction, startWorldAuction, stopAuction } from './auctionService'; import { DicGuildActivity } from '../pubUtils/dictionary/DicGuildActivity'; -import { dispatch } from '../util/dispatcher'; +import { dispatch } from '../pubUtils/dispatcher'; import { initMarquee, setServerMainten } from './gmService'; import moment = require('moment'); import { reportOneOnline } from './authenticateService'; @@ -323,7 +323,7 @@ export async function guildActivityStart(dicGuildActivity?: DicGuildActivity) { // 开始活动 let guildServers = pinus.app.getServersByType('guild'); for (let serverId of servers) { - let sid = dispatch(serverId.toString(), guildServers, 'guild'); + let sid = await dispatch(redisClient(), serverId.toString(), guildServers, 'guild'); await pinus.app.rpc.guild.guildActivityRemote.raceActivityStart.toServer(sid.id, serverId); } @@ -414,7 +414,7 @@ export async function raceActivitySeconds() { let servers = await getAllServers(); // 玩家serverId列表 let guildServers = pinus.app.getServersByType('guild'); for (let serverId of servers) { - let sid = dispatch(serverId.toString(), guildServers, 'guild'); + let sid = await dispatch(redisClient(), serverId.toString(), guildServers, 'guild'); await pinus.app.rpc.guild.guildActivityRemote.calWoodenHorseAndSend.toServer(sid.id, serverId); } } diff --git a/game-server/app/util/dispatcher.ts b/game-server/app/util/dispatcher.ts deleted file mode 100644 index 815259d84..000000000 --- a/game-server/app/util/dispatcher.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as crc from 'crc'; -import { pinus } from 'pinus'; - -interface ServerInfo { - id: string; - serverType: string; - host: string; - port: number; - clientHost?: string; - clientPort?: number; - frontend ?: boolean; - - args ?: string | string[]; - cpu ?: number; - -} - - - - - -export function dispatch(uid: string, connectors: ServerInfo[], serverType: string = '') { - let roleRoute = pinus.app.get('roleRoute'); - if(!roleRoute) { - pinus.app.set('roleRoute', new Map>()); - roleRoute = pinus.app.get('roleRoute'); - } - - //测试代码 - // if (serverType == 'activity') { - // if (uid == 'SPDtGqx9Gw') { - // if (connectors.length > 1) { - // connectors = connectors.filter(obj => { return obj.id != 'activity-server-1' }) - // } - // } else { - // connectors = connectors.filter(obj => { return obj.id == 'activity-server-1' }) - // } - // } - connectors.sort((a, b) => a.id > b.id? 1: -1); - - if (serverType) { - let roleRouteData = roleRoute.get(uid); - let serverId = ''; - if (roleRouteData) { - serverId = roleRouteData.get(serverType); - if (serverId) { - let index = connectors.findIndex(obj => { return obj.id === serverId }); - if (index != -1) { - // console.log('aaaaaaaaa 1', roleRouteData) - return connectors[index]; - } - } - } - let index = Math.abs(crc.crc32(uid)) % connectors.length; - if (!roleRouteData) { - roleRouteData = new Map() - } - roleRouteData.set(serverType, connectors[index].id); - roleRoute.set(uid, roleRouteData) - // console.log('aaaaaaaaa 2', roleRouteData) - return connectors[index]; - } - pinus.app.set('roleRoute', roleRoute); - let index = Math.abs(crc.crc32(uid)) % connectors.length; - return connectors[index]; -} \ No newline at end of file diff --git a/game-server/app/util/routeUtil.ts b/game-server/app/util/routeUtil.ts index aa8ebd69b..3de5ae310 100644 --- a/game-server/app/util/routeUtil.ts +++ b/game-server/app/util/routeUtil.ts @@ -1,20 +1,21 @@ -import { dispatch } from './dispatcher'; +import { dispatch } from '../pubUtils/dispatcher'; import { Session, Application } from 'pinus'; +import { redisClient } from '../services/redisService'; -export function chat(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function chat(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let chatServers = app.getServersByType('chat'); if (!chatServers || chatServers.length === 0) { cb(new Error('can not find chat servers.')); return; } - let id = session.get('chatServer')||dispatch(session.get('roleId'), chatServers, 'chat').id; + let id = session.get('chatServer')||(await dispatch(redisClient(), session.get('roleId'), chatServers, 'chat')).id; cb(null, id); } -export function battle(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function battle(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let battleServers = app.getServersByType('battle'); if (!battleServers || battleServers.length === 0) { @@ -42,16 +43,16 @@ export function battle(session: Session, msg: any, app: Application, cb: (err: E } if(needDispatch) { - let id = dispatch(rid, battleServers, 'battle').id; + let id = (await dispatch(redisClient(), rid, battleServers, 'battle')).id; cb(null, id); } else { - let id = session.get('battleServer')||dispatch(rid, battleServers, 'battle').id; + let id = session.get('battleServer')||(await dispatch(redisClient(), rid, battleServers, 'battle')).id; cb(null, id); } } -export function guild(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function guild(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let guildServers = app.getServersByType('guild'); if (!guildServers || guildServers.length === 0) { @@ -126,25 +127,25 @@ export function guild(session: Session, msg: any, app: Application, cb: (err: Er } if(needDispatch) { - let id = dispatch(rid, guildServers, 'guild').id; + let id = (await dispatch(redisClient(), rid, guildServers, 'guild')).id; cb(null, id); } else { - let id = session.get('guildServer')||dispatch(rid, guildServers, 'guild').id; + let id = session.get('guildServer')||(await dispatch(redisClient(), rid, guildServers, 'guild')).id; cb(null, id); } } -export function activity(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function activity(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let activityServers = app.getServersByType('activity'); if (!activityServers || activityServers.length === 0) { cb(new Error('can not find activity servers.')); return; } - let id = session.get('activityServer')||dispatch(session.get('roleId'), activityServers, 'activity'); + let id = session.get('activityServer')||(await dispatch(redisClient(), session.get('roleId'), activityServers, 'activity')); cb(null, id); } -export function gm(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function gm(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let gmServers = app.getServersByType('gm'); if (!gmServers || gmServers.length === 0) { @@ -152,11 +153,11 @@ export function gm(session: Session, msg: any, app: Application, cb: (err: Error return; } - let res = dispatch(session.get('roleId'), gmServers, 'gm'); + let res = await dispatch(redisClient(), session.get('roleId'), gmServers, 'gm'); cb(null, res.id); } -export function role(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function role(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let roleServers = app.getServersByType('role'); if (!roleServers || roleServers.length === 0) { @@ -164,11 +165,11 @@ export function role(session: Session, msg: any, app: Application, cb: (err: Err return; } - let id = session.get('roleServer')||dispatch(session.get('roleId'), roleServers).id; + let id = session.get('roleServer')||(await dispatch(redisClient(), session.get('roleId'), roleServers)).id; cb(null, id); } -export function order(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { +export async function order(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let orderServers = app.getServersByType('order'); if (!orderServers || orderServers.length === 0) { @@ -176,6 +177,6 @@ export function order(session: Session, msg: any, app: Application, cb: (err: Er return; } - let id = session.get('orderServer')||dispatch(session.get('roleId'), orderServers, 'order').id; + let id = session.get('orderServer')||(await dispatch(redisClient(), session.get('roleId'), orderServers, 'order')).id; cb(null, id); } \ No newline at end of file diff --git a/shared/pubUtils/dispatcher.ts b/shared/pubUtils/dispatcher.ts index 1a41a070d..1c52cb780 100644 --- a/shared/pubUtils/dispatcher.ts +++ b/shared/pubUtils/dispatcher.ts @@ -14,45 +14,19 @@ interface ServerInfo { } - - - -let roleRoute = new Map>() - -export function dispatch(uid: string, connectors: ServerInfo[], serverType: string = '') { - //测试代码 - // if (serverType == 'activity') { - // if (uid == 'SPDtGqx9Gw') { - // if (connectors.length > 1) { - // connectors = connectors.filter(obj => { return obj.id != 'activity-server-1' }) - // } - // } else { - // connectors = connectors.filter(obj => { return obj.id == 'activity-server-1' }) - // } - // } +export async function dispatch(redis: any, uid: string, connectors: ServerInfo[], serverType: string = '') { connectors.sort((a, b) => a.id > b.id? 1: -1); if (serverType) { - let roleRouteData = roleRoute.get(uid); - let serverId = ''; - if (roleRouteData) { - serverId = roleRouteData.get(serverType); - if (serverId) { - let index = connectors.findIndex(obj => { return obj.id === serverId }); - if (index != -1) { - // console.log('aaaaaaaaa 1', roleRouteData) - return connectors[index]; - } - } + let appid: string = await redis.hgetAsync('roleRoute', `${uid}_${serverType}`); + if(!appid) { + let index = Math.abs(crc.crc32(uid)) % connectors.length; + let connector = connectors[index]; + appid = connector.id; + redis.hsetAsync('roleRoute', `${uid}_${serverType}`, appid); } - let index = Math.abs(crc.crc32(uid)) % connectors.length; - if (!roleRouteData) { - roleRouteData = new Map() - } - roleRouteData.set(serverType, connectors[index].id); - roleRoute.set(uid, roleRouteData) - // console.log('aaaaaaaaa 2', roleRouteData) - return connectors[index]; + let roleRoute = connectors.find(obj => obj.id == appid); + return roleRoute; } let index = Math.abs(crc.crc32(uid)) % connectors.length; return connectors[index]; diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index 36403004c..d61382056 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -193,7 +193,7 @@ export default class GameController extends Controller { res = randResult.dic; } if(!res) { - res = dispatch(userCode, connectors, 'connector'); + res = await dispatch(ctx.app.context.redisClient, userCode, connectors, 'connector'); } let { id, serverType, clientHost, clientPort, num = 0 } = res;