两组服务器人气回落就合服:角色、邮件、行会、排行全部并入同一个库,两个世界的老玩家在一张地图重逢,合服活动的报名量往往是平日的五倍。ID 冲突是头号问题,两边的玩家编号、行会编号各自独立自增,合并方案在迁移前就要定死,边合边想方案必然出大事故。
function Merge.remapIds(srcDb, dstDb, offsetMap)
local mapping = {}
for _, role in ipairs(srcDb:loadRoles()) do
local newId = dstDb:nextRoleId()
mapping[role.id] = newId
dstDb:insertRole(role, newId)
end
offsetMap.role = mapping
end
function Merge.remapRefs(srcDb, mapping)
for _, mail in ipairs(srcDb:loadMails()) do
mail.to = mapping[mail.to] or mail.to
mail.from = mapping[mail.from] or mail.from
dstDb:insertMail(mail)
end
end
源库每个角色分配目标库新 ID,建立旧到新的映射表,邮件、好友、行会成员等引用字段按映射表二次改写,改写顺序先角色后引用,顺序错了引用就会指到错误的实体。映射表本身落盘保留一年,历史数据的每个旧 ID 都能查到新归属。
function Merge.resolveNames(srcDb, dstDb)
for _, role in ipairs(srcDb:loadRoles()) do
if dstDb:nameExists(role.name) then
role.name = role.name .. ".M"
QF_MailText(role.mappedId, "您的名字与现有玩家重复,已改为 " .. role.name)
end
dstDb:updateName(role.mappedId, role.name)
end
end
重名自动加服务区后缀并邮件告知,行会同名同理,改名卡作为补偿随邮件附送。合服后战力榜、竞技场分段重新计算,第一次快照在合并事务提交后立刻执行,避免榜单真空期。合服演练在测试环境完整走三遍,第二遍专门测中断恢复,回滚脚本随迁移脚本一起准备,合服公告里的停服时长按演练实测值上浮五成给出。
迁移后行数比对、抽样角色数据校验、首日错误率三道关卡全过才放量入口。
映射表保留一年的决定在第三个月就派上用场,玩家拿着一年前的旧截图来找装备,旧 ID 到新 ID 的追溯片刻搞定。演练第二遍的中断恢复测试抓到过事务未回滚的引用孤儿,几百封邮件指向已不存在的旧 ID,清理脚本从此成为迁移包的固定成员。合服公告的停服时长按演练实测值上浮五成,实际比公告早开服成为惯例,玩家的等待预期被稳稳接住。迁移窗口选择在周中凌晨三点,避开周末的回流高峰与工作日晚间的活跃时段,停服公告提前七天推送了三次。迁移后的首小时监控看三样东西:登录成功率、邮件到达延迟、聊天频道消息量,三项指标全绿才开放充值入口。行会合并的重名协商做了自助工具,两个同名行会的会长在工具里自行协商改名方案,协商不成系统按创建时间保留长者,规则的确定性减少了人为纠纷。迁移窗口选择在周中凌晨三点,避开周末的回流高峰与工作日晚间的活跃时段,停服公告提前七天推送了三次。迁移后的首小时监控看三样东西:登录成功率、邮件到达延迟、聊天频道消息量,三项指标全绿才开放充值入口。行会合并的重名协商做了自助工具,两个同名行会的会长在工具里自行协商改名方案,协商不成系统按创建时间保留长者,规则的确定性减少了人为纠纷。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…