跨服战场里本服玩家给跨服侧发消息,目标服地址写死在脚本里,某台跨服节点下线后消息石沉大海。跨服路由把目标地址收敛进路由表:消息按目标服标识查表转发,未知目标直接拦截告警,节点下线由路由表摘除。
路由表维护目标服到转发通道的映射,转发封装统一做地址校验、消息登记与异常拦截,业务侧不直接接触通道细节。
local ROUTE = { ["S1"] = "chan_s1", ["S2"] = "chan_s2", ["S3"] = "chan_s3" }
local function routeMsg(dstSrv, kind, payload)
local chan = ROUTE[dstSrv]
if chan == nil then
sendmail("#运维老张", 918, "跨服路由异常", "未知目标服 " .. dstSrv .. ",消息已拦截", "")
return false
end
sendluamsg(dstSrv, 7350, 0, 0, 0, kind .. "|" .. payload)
return true
end
每条跨服消息登记源服、目标服、类型与时间戳,投递超时未收到回执的消息进入重发队列,最多重发三次。
local PENDING = {}
local function sendTracked(dstSrv, kind, payload)
local msgId = os.time() .. "|" .. dstSrv
PENDING[msgId] = { t = os.time(), retry = 0 }
routeMsg(dstSrv, kind, payload)
return msgId
end
local function ackMsg(msgId)
PENDING[msgId] = nil
end
路由验证三服地址全部可达、未知服拦截告警、下线节点摘除后消息走重发;回执超时三次后消息转入人工核对清单。转发链路对业务透明,业务侧只声明目标服与消息类型,通道选择由路由层决定。未知目标的拦截名单每天核对一次,连续出现的未知目标服说明有脚本写死了过时地址。路由表变更走登记审批,每次调整都留变更人、变更时间与影响范围,回查问题时按变更记录倒推。监控跨服消息的投递成功率与重发次数,重发集中在同一目标服就是节点不稳定。
路由表写死在三个脚本里,节点扩容后改表漏了一处,消息继续发往已下线的旧节点,路由表收敛为单点维护。消息登记只记了发送没记回执,重发无法判断哪些已送达,回执消费登记后整条链路才可查可追溯。payload 里带竖线分隔符与登记格式冲突,登记字段统一转义。跨服节点维护窗口的路由摘除靠人工,摘除脚本接入值班公告后自动化执行。消息类型注册与路由表合并管理,新增跨服消息类型只登记一处,避免类型与路由两套清单各改各的。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 装备回收商 NPC 每天按评分收购玩家的装备,裁决之杖、骨玉权杖按攻击、持久加权打分,榜上只要前五名。数…
实战应用:用在哪里 沙巴克攻城是全服行会战的最高舞台:攻方砸开城门、抢占皇宫,守方依托城墙与复活点反打。规则设计的关键是节奏…
实战应用:用在哪里 影分身玩法给法师职业补上生存短板:危急时刻召唤四个影分身分担仇恨,敌人需要在六格范围内分辨真身,猜错就浪…
实战应用:用在哪里 组队邀请、行会宣战这类关键信令丢了没有兜底,玩家只能反复手点,高峰期体验很差。重试机制给信令加确认回执:…
实战应用:用在哪里 新资料片上线首日预约量常是日常十倍,一口气全开会让数据库与登录网关同时过载。滚动开区把开区动作排成队列:…
实战应用:用在哪里 百人同屏的沙巴克外围战场,每个玩家每秒跑动会触发数次位置更新,全部即时下发时广播量随人数平方增长,网关先…