跨服迁移、批量发放、数据迁移这类“多步骤强顺序”的业务,步骤之间有硬依赖:上一步失败下一步必须停止。通用串行队列把步骤组织成数组,逐个执行、失败中断、可从失败步骤重试。
local function runQueue(queue)
while queue.idx <= #queue.steps do
local step = queue.steps[queue.idx]
local ok, err = pcall(step.fn, queue.ctx)
if not ok then
queue.failedAt = queue.idx
queue.err = err
return false
end
queue.idx = queue.idx + 1
end
return true
end
-- 从失败步骤重试
local function retry(queue)
return runQueue(queue) -- idx 停留在失败步骤
end
每个步骤是一个函数,接收共享上下文 ctx(前序步骤的产出放 ctx 里传递)。失败时 idx 停留在失败步骤,修复问题后 retry 从该步骤继续,已完成的步骤不重复执行。
跨服迁移这类长流程把队列状态(ctx 与 idx)序列化落盘,进程重启后从落盘状态恢复执行。落盘时机:每完成一步落一次(步骤粒度足够细,单步损失可接受)。步骤函数要求幂等——重启后从当前步骤重跑一遍,已生效的部分因幂等而不产生副作用。
串行队列适合“步骤少于 20、依赖明确、失败需要人工介入”的流程;大数量的批量任务用分帧调度(性能调优篇)或专业队列系统。判据是失败后的行为:需要人工修复后继续的走串行队列,可以自动放弃的用事件总线广播即可。两套机制并存、按业务选择,异步代码的结构就清晰了。
步骤的幂等要求写在每个步骤的注释里:该步骤重复执行是否安全、不安全时的保护机制是什么。幂等的手法有三类:状态机推进(重复请求返回首次结果)、唯一键去重(数据库唯一索引挡重复写入)、乐观锁(版本号比对后更新)。三类手法覆盖九成场景,步骤作者按业务语义选择即可。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…