根据在线人数路由

This commit is contained in:
luying
2022-08-12 09:39:56 +08:00
parent 3e2c408645
commit 1313f0777f
7 changed files with 143 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 *******/

View File

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

View File

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