🎈 perf(dispatch): 路由使用redis

This commit is contained in:
luying
2023-04-26 09:54:55 +08:00
parent 6907275ff2
commit e1d2b4b349
13 changed files with 67 additions and 154 deletions

View File

@@ -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 });
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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
}

View File

@@ -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);
}

View File

@@ -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<string, GVGBattleData> = 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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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<string, Map<string, string>>());
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<string, string>()
}
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];
}

View File

@@ -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);
}

View File

@@ -14,45 +14,19 @@ interface ServerInfo {
}
let roleRoute = new Map<string, Map<string, string>>()
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<string, string>()
}
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];

View File

@@ -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;