不是每一件事都要立刻做完:掉落的归属结算、邮件的批量投递、排行榜的更新——非紧急的任务进队列慢慢消化,玩家的关键路径(攻击、移动)永远优先。延迟结算是性能的调度学。
---延迟结算:优先级的任务队列
local Queue = { high = {}, normal = {}, low = {} }
function Queue.push(priority, fn)
table.insert(Queue[priority], fn)
end
setontimerex(110, 1)
function Queue.drain()
-- 每秒的预算 50 毫秒
local budget = 0.05
local t0 = os.clock()
for _, lvl in ipairs({ "high", "normal", "low" }) do
while #Queue[lvl] > 0 do
local fn = table.remove(Queue[lvl], 1)
local ok, err = pcall(fn)
if not ok then
Ops.alert("延迟任务异常: " .. tostring(err))
end
if os.clock() - t0 > budget then
return -- 预算耗尽,下轮继续
end
end
end
end
队列的三级优先:高(交易与支付的结算)、中(掉落的归属与邮件)、低(排行榜与统计的更新),每秒的消化预算 50 毫秒——预算的墙让队列的消化永远不挤占玩家的关键路径。任务用闭包入队:结算所需的上下文在入队时捕获,到点执行时自带全部的原料。异常的隔离用 pcall:单个任务的报错不拖垮队列的整轮消化。
---延迟的时效:掉落归属的 3 秒上限
function Drop.delayedSettle(bossId)
Queue.push("high", function()
local owner = BossDamage.owner(bossId)
if owner then
BossDrop.assign(bossId, Drop.listOf(bossId))
end
end)
end
---队列的积压监控
setontimerex(111, 5)
function Queue.monit()
local total = #Queue.high + #Queue.normal + #Queue.low
if total > 2000 then
Ops.alert("队列积压", total)
end
end
延迟有时效的分级:掉落的归属 3 秒内必须结算(玩家盯着地上等裁决)、邮件的投递 5 分钟内、统计的更新容忍 1 小时——时效的承诺写进每类任务的注册,超时的任务升级优先级。积压的监控在 2000 条的警戒线:积压的突增说明产出的速度超过消化的能力,预算的上调或任务的降频二选一。延迟结算的正确性靠上下文的快照:入队时捕获的数据(BOSS 的伤害表、掉落的清单)在结算时依然有效,变化的中间态用版本号丢弃过期的任务。
队列的消化延迟分位监控:入队到执行的耗时分布,各优先级各自的 P95 对齐时效的承诺;预算的使用率统计,预算长期打满即是扩容的信号。
预算的检查曾经放在任务完成后,单个慢任务把一秒的预算全部吃光,前置的预算判断修复。闭包捕获的上值曾经在入队后被释放,结算时的空引用,上下文的快照化替代引用捕获。队列的优先级曾经只有两级,统计类的低优任务饿死在交易的高峰,三级的分层让低优也有活路。
任务的时效分级注册进队列的接入文档,每类任务有自己的承诺。预算的毫秒数随在线的规模配置,高峰的动态调整有预案。队列的积压量与消化的速率进性能的看板,调度的健康一屏可见。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…