外部依赖抖动时,每次调用都傻等超时(2 秒),高峰期的失败请求排队堆积把脚本线程拖垮。熔断器的状态机:连续失败达到阈值(5 次)进入“打开”状态——后续请求不再真调,立即快速失败;静默期(30 秒)过后进入“半开”,放一个试探请求真调:成功则关闭熔断恢复正常,失败则重新打开。熔断把“每个请求都付出超时代价”变成“少数请求付出快速失败的小代价”,保护调用方也保护抖动的依赖方。
熔断器三态:closed 正常放行、open 快速失败、half-open 单发试探。示例代码如下:
local function createBreaker(threshold, coolSec)
local fails, openedAt = 0, 0
local THRESHOLD, COOL = threshold, coolSec
return {
call = function(fn)
if openedAt > 0 and os.time() - openedAt < COOL then
return false, "circuit-open"
end
if openedAt > 0 then
openedAt = 0
fails = 0
end
local ok = fn()
if ok then
fails = 0
return true
end
fails = fails + 1
if fails >= THRESHOLD then
openedAt = os.time()
end
return ok
end,
}
end
local mailBreaker = createBreaker(5, 30)
业务接入:邮件补发走熔断器,抖动期快速失败不阻塞。示例代码如下:
local function safeSendMail(actor, ticket)
actor = getplayerbyname(actor)
local ok, why = mailBreaker.call(function()
sendmail("#" .. tostring(actor), 9080, "奖励补发",
"补发单[" .. ticket .. "]。", "金条#1#0")
return true
end)
if not ok then
sendmsg(actor, 1, "补发延迟中:邮件通道" ..
(why == "circuit-open" and "熔断保护" or "异常") .. "。")
end
end
本篇的新技术点是“半开试探即自愈”:open 状态冷却期满后自动放一个真请求探路——成功则熔断关闭恢复,失败则重新打开,无需人工介入。
抖动期对照(依赖 30 秒内不可用、积压 100 请求):无熔断每请求等待 2 秒超时,100 个请求串行拖 200 秒;熔断打开后每请求 0.0001ms 快速失败,积压请求全部立即得到“延迟中”反馈,成功请求在恢复后自动续发。失败计数成本:三次算术加比较,单次 0.0002ms。熔断打开的 30 秒内跳过 100 次无效等待,节省 200 秒的线程占用。
熔断保护的是“调用方不被拖垮”,被调方(外部接口)的恢复要靠对端自愈或人工——熔断不解决依赖本身的故障。半开试探的流量要限制(每冷却期一次),否则试探流量本身压垮恢复中的依赖。另外,熔断状态是进程内状态,重启即重置为 closed——重启后第一波请求会真调依赖,依赖未恢复时靠快速失败阈值再次打开,自愈链路成立。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 活动币(节日代币、赛季积分)的灵魂问题是“过期怎么办”:永久保留则库存越滚越大、商店压力与经济失衡逐年加剧;一刀清…
设计初衷 打宝地图(高产出高风险的专属地图)是服务器产出的调节阀:普通图产出保底,打宝图产出上浮但设门槛。准入凭证的设计目标…
底层原理 把表转成可读字符串(调试输出、存档导出)时,循环引用是最大障碍:A 引用 B、B 引用 A,朴素递归无限展开直到栈…
底层原理 外部依赖抖动时,每次调用都傻等超时(2 秒),高峰期的失败请求排队堆积把脚本线程拖垮。熔断器的状态机:连续失败达到…
设计初衷 行会日常缺少“全 会一起嗨”的集体时刻:活动是少数人打的,福利是各自领的。行会祝福由会长或官员主动触发,全行会成员…
业务场景 新人入会是行会活跃的风向标:一条及时的欢迎语让新人三分钟内融入。自动欢迎的痛点是刷屏与模板疲劳:欢迎语千篇一律、连…