千人在线单网关出包到顶,扩到三个网关后新问题来了:同一玩家登出登录落到不同网关,推送丢失;全服广播只走了一个网关,另外两个网关的玩家看不到公告。负载均衡要配粘性会话与广播一致性才完整。
登录按账号哈希选网关,同一账号稳定落同一网关,会话内不漂移。
local GATEWAYS = 3
local function pickGateway(account)
local h = 0
for i = 1, #account do
h = (h * 31 + string.byte(account, i)) % 997
end
return h % GATEWAYS + 1
end
全服广播写进广播流水,每个网关按自己游标拉取补发,掉线重连的玩家按末次序号补齐。
local broadcastSeq = 0
local function broadcast(text)
broadcastSeq = broadcastSeq + 1
setsysvarex("BCAST_" .. broadcastSeq, text, 1)
for gw = 1, GATEWAYS do
setsysvar("BCAST_NOTIFY_GW", gw)
end
end
压测三网关下登录一万次,粘性命中率应高于百分之九十九;广播到达率按网关分桶统计,缺口即一致性缺陷。监控单网关连接数方差,方差过大说明哈希分布倾斜,换加权轮询。
string.byte逐字符哈希在长账号名下有性能开销,登录高峰先缓存结果再路由。广播流水的setsysvarex逐条落盘会让存储翻倍,流水改内存环形队列加定期快照。广播到网关的下发走服务间通道,Lua侧负责流水与游标管理,别把网关当玩家对象处理。粘性命中低于十成的根因多半是哈希种子不一致,三台机器的时间与时区先对齐。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会福利只有加成和宝库,缺少可成长的实体。行会技能塔给行会一座可以逐层点亮的塔:全行会捐献建材升级塔层,…
实战应用:用在哪里 新手玩家的第一次长途旅行总在比奇到沃玛的路上迷路或被怪打死。新手护送教学线把这段路变成有老玩家护航的成人…
实战应用:用在哪里 行会招新全靠世界频道刷屏,招募信息水贴一样沉底。行会招募接口给招新一个正式渠道:行会发布结构化招募信息(…
实战应用:用在哪里 拍卖行商品上万件,翻页找裁决之杖像大海捞针。商城搜索给拍卖行装上联想与筛选:输入前两个字即时联想候选关键…
实战应用:用在哪里 桃源之门是传奇最有韵味的隐藏地图:条件不明、入口隐秘,找到即是传说。隐藏地图的触发设计要把开启条件做成可…
实战应用:用在哪里 行会年度战报打包后仍有五百 KB,分包下发到第九包时玩家掉线,前功尽弃重来。分包进阶方案叠加断点续传与压…