消息处理失败就丢弃,等于把偶发故障变成玩家资产损失。死信队列给失败消息一条后路:重试三次仍失败的消息转入死信队列单独存放,值班定期核查死信水位,人工修复后重新投递,任何一条消息都有来处和去处。
处理失败的消息连同错误原因写入死信队列,重试计数同步累加,三次重试都失败就停止自动投递,转人工核查。
local DEAD = {}
local function toDeadLetter(msg, err)
table.insert(DEAD, { msg = msg, err = err, retry = 0 })
end
local function process(msg)
local ok, err = pcall(handle, msg)
if not ok then
toDeadLetter(msg, tostring(err))
end
end
死信队列每小时重试一轮,重试满三次的消息标记为人工处理,值班从死信清单里逐条修复后清出队列。
setontimerex(210, 3600)
function ontimer210()
local kept = {}
for _, d in ipairs(DEAD) do
if d.retry < 3 then
d.retry = d.retry + 1
local ok = pcall(handle, d.msg)
if not ok then
table.insert(kept, d)
end
else
table.insert(kept, d)
sendmail("#值班老张", 943, "死信需人工处理", "积压 " .. #kept .. " 条", "")
end
end
DEAD = kept
end
构造必失败消息验证三次重试后进入人工清单;可修复消息人工处理后成功出队;死信水位每小时归档一次。监控死信队列的水位曲线,水位上升的斜率对应故障的严重程度,值班按斜率排优先级。
死信只存了消息没存错误原因,人工排查时不知道失败在哪一步,错误信息随消息一起入死信。重试没有间隔控制,三次重试在一秒内打完,故障还没恢复重试就耗尽了,重试间隔拉到 600 秒。人工修复后的消息重复入队,队列按消息唯一号去重。死信水位只统计数量不分类别,支付类死信与聊天类死信混在一起,支付类的优先级被拉高处理。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 装备回收商 NPC 每天按评分收购玩家的装备,裁决之杖、骨玉权杖按攻击、持久加权打分,榜上只要前五名。数…
实战应用:用在哪里 沙巴克攻城是全服行会战的最高舞台:攻方砸开城门、抢占皇宫,守方依托城墙与复活点反打。规则设计的关键是节奏…
实战应用:用在哪里 影分身玩法给法师职业补上生存短板:危急时刻召唤四个影分身分担仇恨,敌人需要在六格范围内分辨真身,猜错就浪…
实战应用:用在哪里 组队邀请、行会宣战这类关键信令丢了没有兜底,玩家只能反复手点,高峰期体验很差。重试机制给信令加确认回执:…
实战应用:用在哪里 新资料片上线首日预约量常是日常十倍,一口气全开会让数据库与登录网关同时过载。滚动开区把开区动作排成队列:…
实战应用:用在哪里 百人同屏的沙巴克外围战场,每个玩家每秒跑动会触发数次位置更新,全部即时下发时广播量随人数平方增长,网关先…