diff --git a/game-server/app.ts b/game-server/app.ts index a32524946..d4d2e1b6d 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -223,6 +223,7 @@ function setupRoutes(app: _pinus.Application) { app.route('guild', routeUtil.guild); app.route('activity', routeUtil.activity); app.route('order', routeUtil.order); + app.route('role', routeUtil.role); } function setupFilters(app: _pinus.Application) { diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index 4548f1b69..618053a6c 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -14,7 +14,7 @@ import { rmRoleFromQueue, roleLeave, getRoleOnlineInfo, roleLogin, getOnlineRole import { addRoleToGuildChannel, addRoleToSysChannel, addRoleToWorldChannel, leaveGuildAuctionChannel, leaveGuildChannel, leaveSysChannel, leaveWorldAuctionChannel, leaveWorldChannel, recentGuildMsgs, recentPrivateChatInfos, recentSysMsgs, recentWorldMsgs } from '../../../services/chatService'; import { reportOneOnline, savePlayTime } from '../../../services/authenticateService'; import { checkTaskInEntry, } from '../../../services/task/taskService'; -import { pushData, kickUser, getModuleData } from '../../../services/connectorService'; +import { pushData, kickUser, getModuleData, assignServer, leaveServer } from '../../../services/connectorService'; // import { setComBtlOnUserLeave } from '../../../services/comBattleService'; import Counter from '../../../db/Counter'; import { getExpByLv } from '../../../pubUtils/data'; @@ -133,6 +133,7 @@ export class EntryHandler { session.push('ip', () => { }); session.push('vipStartTime', () => { }); session.push('channel', () => { }); + assignServer(role.roleId, session); // console.log(role.guildCode) // session.push('rid', function (err) { // if (err) { @@ -206,6 +207,7 @@ export class EntryHandler { // setComBtlOnUserLeave(roleId, teamCode) // } saveLoginAndOutLog(LOG_TYPE.LOGINOUT, session); + leaveServer(session); } diff --git a/game-server/app/servers/connector/remote/connectorRemote.ts b/game-server/app/servers/connector/remote/connectorRemote.ts index 4f6acfe70..a3565b2c6 100644 --- a/game-server/app/servers/connector/remote/connectorRemote.ts +++ b/game-server/app/servers/connector/remote/connectorRemote.ts @@ -3,7 +3,7 @@ import { STATUS } from '../../../consts/statusCode'; import { resResult } from '../../../pubUtils/util'; import { reloadResources } from '../../../pubUtils/data'; import { UserGuildType } from '../../../db/UserGuild'; -import { kickUser } from '../../../services/connectorService'; +import { incServerNum, kickUser } from '../../../services/connectorService'; import { PVPConfigModel, PVPConfigType } from '../../../db/SystemConfig'; import { setDicAuctionTime, setDicGuildActivity } from '../../../services/guildActivity/guildActivityService'; import { getServerMainten, setServerMainten, stopServerMainten } from '../../../services/gmService'; @@ -163,4 +163,12 @@ export class ConnectorRemote { errlogger.error(`remote ${__filename} \n ${e.stack}`); } } + + public async incServerNum(sid: string, inc: number) { + try { + incServerNum(sid, inc); + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } } diff --git a/game-server/app/services/connectorService.ts b/game-server/app/services/connectorService.ts index 58e45dd3d..e9a20fc6c 100644 --- a/game-server/app/services/connectorService.ts +++ b/game-server/app/services/connectorService.ts @@ -7,7 +7,7 @@ import { getCurTask, getPvpTask } from './task/taskService'; import { RoleType } from '../db/Role'; import { Application, FrontendOrBackendSession, pinus, RpcClient } from 'pinus'; -import { resResult } from '../pubUtils/util'; +import { getRandEelmWithWeight, resResult } from '../pubUtils/util'; import { STATUS, PUSH_BATCH, PUSH_INTERVAL, CONSUME_TYPE, HERO_SELECT, ENTERY_ROLE_PICK, JEWEL_SELECT, ITEM_SELECT, SKIN_SELECT, PUSH_ROUTE } from '../consts'; import { getAllShopList } from './shopService'; import { getGeneralRank, getRankFirstReward } from './rankService'; @@ -47,6 +47,7 @@ import { getSurvey } from './gmService'; import { ComBattleTeamModel } from '../db/ComBattleTeam'; import { INFO_WINDOW } from '../pubUtils/dicParam'; import { getLadderData } from './ladderService'; +import { dispatch } from '../pubUtils/dispatcher'; /** * init: 初始的时候是否推送 true-推 false-不推 @@ -320,3 +321,87 @@ export async function kickUser(app: Application, uid: string, message = STATUS.L } await sessionService.akick(uid); } + +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'); + if(activity) { + session.set('activityServer', activity); + session.push('activityServer', () => { }); + } + if(battle) { + session.set('battleServer', battle); + session.push('battleServer', () => { }); + } + if(chat) { + session.set('chatServer', chat); + session.push('chatServer', () => { }); + } + if(guild) { + session.set('guildServer', guild); + session.push('guildServer', () => { }); + } + if(role) { + session.set('roleServer', role); + session.push('roleServer', () => { }); + } + if(order) { + session.set('orderServer', order); + session.push('orderServer', () => { }); + } + } catch(e) { + console.log(e) + } +} + +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 = ''; + if(sum <= 0) { + id = dispatch(roleId, servers, serverType)?.id; + } else { + let serversWithWeight = servers.map(cur => ({...cur, weight: sum - (cur['num']||0)})); + let { dic: server } = getRandEelmWithWeight(serversWithWeight); + id = server?.id; + } + + // if(id) { + // pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(id, 1); + // } + return id +} + +export function incServerNum(sid: string, inc: number) { + if(!pinus.app.getServerById(sid)) return; + if(!pinus.app.getServerById(sid)['num']) { + pinus.app.getServerById(sid)['num'] = 0; + } + pinus.app.getServerById(sid)['num'] += inc; + if(pinus.app.getServerById(sid)['num'] < 0) { + pinus.app.getServerById(sid)['num'] = 0; + } +} + +export async function leaveServer(session: FrontendOrBackendSession) { + let activity = session.get('activityServer'); + let battle = session.get('battleServer'); + let chat = session.get('chatServer'); + let guild = session.get('guildServer'); + let role = session.get('roleServer'); + let order = session.get('orderServer'); + let sid = session.get('sid'); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(activity, -1); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(battle, -1); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(chat, -1); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(guild, -1); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(role, -1); + pinus.app.rpc.connector.connectorRemote.incServerNum.broadcast(order, -1); + + incServerNum(sid, -1); +} \ No newline at end of file diff --git a/game-server/app/services/redisService.ts b/game-server/app/services/redisService.ts index ed39804e1..ae26dea94 100644 --- a/game-server/app/services/redisService.ts +++ b/game-server/app/services/redisService.ts @@ -575,6 +575,15 @@ export async function checkConnectors() { } } +export async function incConnectorNum(sid: string, inc: number) { + let server = await redisClient().hgetAsync(REDIS_KEY.SYS_SERVER, sid); + let json = JSON.parse(server); + let { id, serverType, clientHost, clientPort, num = 0 } = json; + let newNum = num + inc; + if(newNum < 0) newNum = 0; + await redisClient().hsetAsync(REDIS_KEY.SYS_SERVER, id, JSON.stringify({ serverType, clientHost, clientPort, id, num: num + inc })); +} + /*************** 将connector服插入redis *******/ diff --git a/game-server/app/util/routeUtil.ts b/game-server/app/util/routeUtil.ts index 24130f000..7ba230d57 100644 --- a/game-server/app/util/routeUtil.ts +++ b/game-server/app/util/routeUtil.ts @@ -9,9 +9,9 @@ export function chat(session: Session, msg: any, app: Application, cb: (err: Err cb(new Error('can not find chat servers.')); return; } + let id = session.get('chatServer')||dispatch(session.get('roleId'), chatServers, 'chat').id; - let res = dispatch(session.get('roleId'), chatServers, 'chat'); - cb(null, res.id); + cb(null, id); } export function battle(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { @@ -38,8 +38,8 @@ export function battle(session: Session, msg: any, app: Application, cb: (err: E } } - let res = dispatch(rid, battleServers, 'battle'); - cb(null, res.id); + let id = session.get('battleServer')||dispatch(rid, battleServers, 'battle').id; + cb(null, id); } @@ -89,8 +89,8 @@ export function guild(session: Session, msg: any, app: Application, cb: (err: Er } } - let res = dispatch(rid, guildServers, 'guild'); - cb(null, res.id); + let id = session.get('guildServer')||dispatch(rid, guildServers, 'guild').id; + cb(null, id); } export function activity(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { @@ -99,8 +99,8 @@ export function activity(session: Session, msg: any, app: Application, cb: (err: cb(new Error('can not find activity servers.')); return; } - let res = dispatch(session.get('roleId'), activityServers, 'activity'); - cb(null, res.id); + let id = session.get('activityServer')||dispatch(session.get('roleId'), activityServers, 'activity'); + cb(null, id); } export function gm(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { @@ -115,6 +115,18 @@ export function gm(session: Session, msg: any, app: Application, cb: (err: Error cb(null, res.id); } +export function role(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { + let roleServers = app.getServersByType('role'); + + if (!roleServers || roleServers.length === 0) { + cb(new Error('can not find activity servers.')); + return; + } + + let id = session.get('roleServer')||dispatch(session.get('roleId'), roleServers).id; + cb(null, id); +} + export function order(session: Session, msg: any, app: Application, cb: (err: Error, serverId?: string) => void) { let orderServers = app.getServersByType('order'); @@ -123,6 +135,6 @@ export function order(session: Session, msg: any, app: Application, cb: (err: Er return; } - let res = dispatch(session.get('roleId'), orderServers, 'order'); - cb(null, res.id); + let id = session.get('orderServer')||dispatch(session.get('roleId'), orderServers, 'order').id; + cb(null, id); } \ No newline at end of file diff --git a/web-server/app/controller/game.ts b/web-server/app/controller/game.ts index d72a519d2..ecb16e203 100644 --- a/web-server/app/controller/game.ts +++ b/web-server/app/controller/game.ts @@ -10,7 +10,7 @@ import { dispatch } from 'app/pubUtils/dispatcher'; import { RedisClient } from 'redis'; import { REDIS_KEY } from '@consts'; import { RegionModel } from '@db/Region'; -import { resResult } from 'app/pubUtils/util'; +import { getRandEelmWithWeight, resResult } from 'app/pubUtils/util'; export default class GameController extends Controller { @@ -158,7 +158,18 @@ export default class GameController extends Controller { return } // select connector - let res = dispatch(userCode, connectors, 'connector'); + let sum = connectors.reduce((pre, cur) => pre + (cur['num']||0), 0); + let res; + if(sum == 0) { + res = dispatch(userCode, connectors, 'connector'); + } else { + let serversWithWeight = connectors.map(cur => ({...cur, weight: sum - (cur['num']||0)})); + let randResult = getRandEelmWithWeight(serversWithWeight); + res = randResult.dic; + } + let { id, serverType, clientHost, clientPort, num = 0 } = res; + + await redisClient.hsetAsync(REDIS_KEY.SYS_SERVER, id, JSON.stringify({ serverType, clientHost, clientPort, id, num: num + 1 })); ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, { host: res.clientHost, port: res.clientPort }); return }