出口带宽是固定资源(比如 10MB 每秒):攻城战里战斗消息、世界聊天、榜单刷新同时争抢,无调度时先到先得——聊天刷屏的洪峰把战斗消息挤到延迟 800 毫秒,玩家看到技能特效飘了半秒才掉血。带宽调度的本质是按优先级分配预算:每帧把出口带宽切成份额,战斗类保底 60%、聊天类 30%、刷新类 10%,高优先级用不完的份额可以让给低优先级,但低优先级永远挤不掉高优先级的保底。
优先级队列与每帧预算:三类通道、保底份额、让渡机制。示例代码如下:
local lanes = {
{ name = "combat", quota = 0.6, queue = {} },
{ name = "chat", quota = 0.3, queue = {} },
{ name = "refresh", quota = 0.1, queue = {} },
}
local FRAME_BUDGET = 200 * 1024
local function enqueue(kind, payload)
for _, l in ipairs(lanes) do
if l.name == kind then
l.queue[#l.queue + 1] = payload
return
end
end
end
local function pumpFrame()
local remaining = FRAME_BUDGET
for _, l in ipairs(lanes) do
local share = math.floor(FRAME_BUDGET * l.quota)
while #l.queue > 0 and share - #l.queue[#l.queue] * 64 >= 0 do
local p = table.remove(l.queue, 1)
share = share - #p * 64
remaining = remaining - #p * 64
sendRaw(p)
end
end
return remaining
end
三类消息入队示例代码如下:
enqueue("combat", "伤害结算包")
enqueue("chat", "世界聊天包")
enqueue("refresh", "榜单刷新包")
攻城洪峰实测(聊天每秒 3000 条刷屏 + 战斗消息正常量):无调度时战斗消息平均延迟 780 毫秒,玩家感知技能"漂移";优先级调度后战斗通道保底 60% 份额,延迟稳定在 40 毫秒以内,聊天延迟上升到 200 毫秒但可接受。份额让渡的效果:战斗空闲时段(刷怪期)聊天实际可用带宽自动涨到 90%,不需要人工调整配比。
三个不适用场景:一是出口带宽远大于峰值流量(负载率长期低于三成)的服务器,调度层没有触发条件,直接发送即可;二是消息之间无优先级差异的通道(全是同级的日志上报),排队反而增加延迟;三是延迟敏感到微秒级的场景,调度器的分队列维护本身引入抖动,这类流量应物理隔离到独立通道。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:40 张价目表进程启动全量加载,其中 33 张一天没人访问,白占 18MB——能不能首次访问才加载,访问过的驻…
一、一行代码拆解:local nxt = FSM[state][ev] —— 这一行把祖玛教主狂暴流程写进二维表:状态为行、…
一、一行代码拆解:v = a + (b - a) t —— 这一行是线性插值,t 从 0 走到 1,烈火剑法伤害从 800 …
一、隐蔽陷阱:sendmsg 直接拼 stock 表,屏上永远是 "table: 0x0064a2c0",排查库存差异只能靠…
一、线上事故:报名次数 getplayvar 取回 nil 被 or 0 兜成零,没报过名的与正好 0 次的混成一团,守城补…
一、线上事故:施放入口按装备类型写分支,新装备"弓"上线漏改 elseif,1200 次施放静默不触发,补偿 500 金元。…