活动配置以 JSON 存在配置中心,业务脚本每次读取都执行一遍 cjson.decode,峰值时段同一份配置每分钟被重复解析上百次。解析热点治理很简单:解析结果按键缓存,同一份配置一个进程只解析一次,解析次数从每分钟两百次降到个位数。热点治理的收益不只是省 CPU:解析次数下降后,配置格式不兼容引发的解析异常也从每天十几条降到接近于零。
配置读取入口先查缓存,未命中才执行 cjson.decode 并写入缓存表,缓存键与配置中心的活动键一一对应。
local cjson = require "cjson"
local cache = {}
local decodeCnt = 0
local function getActivityCfg(key)
if cache[key] == nil then
local raw = getsysvar("ACT_JSON_" .. key) or "{}"
decodeCnt = decodeCnt + 1
cache[key] = cjson.decode(raw)
end
return cache[key]
end
解析次数按分钟统计,热点超过阈值就广播提醒,定位是谁绕过了缓存入口直接解析,让热点无处藏身。
setontimerex(194, 60)
function ontimer194()
if decodeCnt > 100 then
sendcentermsg("JSON 解析热点 " .. decodeCnt .. " 次/分钟,请检查是否绕过缓存")
decodeCnt = 0
end
end
同一配置键千次读取只触发一次真实解析;配置热更新后缓存失效,新配置立即生效;空串与非法 JSON 走兜底不报错。缓存容量按配置键数量上限五十个控制,超出按最久未访问淘汰,防止缓存表无限膨胀。监控每分钟解析次数曲线与缓存命中比,解析次数回升说明有新代码绕过了统一入口。
配置里带注释的 JSON cjson 解不开,配置中心产出侧去注释,解析侧只收纯 JSON,两边约定写进配置规范。奖励金额字段是超出整型精度的大数字,解析后精度丢失导致发奖金额偏差,大额字段改为字符串传输业务侧自行转数值。空串直接 decode 抛出异常,入口统一兜底空表。缓存没有失效机制,活动改了配置脚本还在读旧缓存,热更新钩子里统一清空缓存表并登记版本号。解析热点定位用了最笨也最有效的办法:在 decode 包装函数里计数,数字一出来,绕过缓存的代码位置自然浮出水面。治理后单次解析耗时均值 3 毫秒,每分钟解析次数从两百次降到五次以内,主循环的卡顿尖峰同步消失。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 装备回收商 NPC 每天按评分收购玩家的装备,裁决之杖、骨玉权杖按攻击、持久加权打分,榜上只要前五名。数…
实战应用:用在哪里 沙巴克攻城是全服行会战的最高舞台:攻方砸开城门、抢占皇宫,守方依托城墙与复活点反打。规则设计的关键是节奏…
实战应用:用在哪里 影分身玩法给法师职业补上生存短板:危急时刻召唤四个影分身分担仇恨,敌人需要在六格范围内分辨真身,猜错就浪…
实战应用:用在哪里 组队邀请、行会宣战这类关键信令丢了没有兜底,玩家只能反复手点,高峰期体验很差。重试机制给信令加确认回执:…
实战应用:用在哪里 新资料片上线首日预约量常是日常十倍,一口气全开会让数据库与登录网关同时过载。滚动开区把开区动作排成队列:…
实战应用:用在哪里 百人同屏的沙巴克外围战场,每个玩家每秒跑动会触发数次位置更新,全部即时下发时广播量随人数平方增长,网关先…