一、抛坑提问:战报队列被写入端疯狂灌,消费端来不及取,队列涨到 5 万条内存告警——队列满时的正确姿势不是硬塞,是背压拒收加计数。
二、底层原理:背压是有界队列的拒绝策略:入队前查长度,达上限即拒收并累加丢弃计数,消费端追上后流量自然恢复;与环形覆盖不同,背压保数据完整,弃新保旧。
三、正确代码:
错误写法。示例代码如下:
local function push(msg)
q[#q + 1] = msg -- 无上限,5万条内存告警
end
正确写法。示例代码如下:
local q, dropped, MAX = {}, 0, 5000
local function push(msg)
if #q >= MAX then
dropped = dropped + 1 -- 满则拒收并计数
return false
end
q[#q + 1] = msg
return true
end
local function pop()
return table.remove(q, 1)
end
sendmsg(actor, 1, "沙巴克战报队列 " .. #q .. " 条,弃 " .. dropped)
四、引擎验证:写入 50000 条消费慢速:无界版内存涨到 5 万条告警;背压版恒 5000 条封顶,丢弃 45000 条全有计数,消费追平后 0 丢弃。
五、FAQ:问:丢弃的消息要补偿吗?答:关键消息别走丢式队列——改持久化,背压只适合可弃数据。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、机制原理 线上事故:前端导出的 cfg 配置表被某次改动塞进一个 [name]=true 的映射项,之后 cf…
【游戏】 一、规则机制 一行判定立规矩:math.abs(t1 - t2) <= 0.5。合击技能要求两名队友"同时"出手,…
【语法】 一、机制原理 隐蔽的计数事故:写了个协议转发器 function relay(...) local n = {..…
【游戏】 一、规则机制 抛个坑:头奖长期没人中,奖池里那笔金币是发不掉还是被系统吞掉?玩家迟早质疑。滚存机制给出正向答案:每…
【游戏】 一、规则机制 抛个问题:世界首领的奖励怎么分才不挨骂?平分则划水躺赢,尾刀独吞则主力退坑。争夺规则改为按伤害占比分…
【语法】 一、机制原理 线上事故:前端用循环给三个功能按钮注册回调,点哪个都弹出同一个数字 3。原因是闭包捕获的是变量本身而…