【懒人精灵】斐波那契数列指数退避算法在网络请求中的应用

项目背景

在某个游戏测试的项目中,需要从服务器获取登录的CK数据。
为了减轻服务器的压力,提高脚本代码的优雅性,采用了斐波那契数列进行网络请求。

设计目的

1.主要用于处理暂时性错误,给系统足够的时间恢复
2.随着重试次数增加,逐渐增加等待时间,避免雪崩效应
3.当达到最大等待时间后,保持该值是最保守和安全的策略
4.在基础等待时间上增加随机值,避免多个客户端同步重试
5.引入最大重试次数限制,而不是仅依赖时间限制,避免无限重试导致的资源浪费
6.通过随机抖动避免多个客户端同步重试

代码片段

-- 在指定分钟数内,获取可用的ck
function getAvailableCK(sid, timeLimit)
    if not sid or sid == '' then return end

    local startTime = tickCount()
    local waitPrev = 0
    local waitCurr = 10
    local waitMax = 300
    local maxRetries = 10  -- 最大重试次数
    local retryCount = 0    -- 当前重试次数

    while true do
        -- 检查是否超时
        if tickCount() - startTime > timeLimit * 60 * 1000 then
            print('提取CK超时')
            break
        end

        -- 除了时间限制外,增加重试次数限制,避免无限重试
        -- 检查是否超过最大重试次数
        if retryCount >= maxRetries then
            print('提取CK达到最大重试次数')
            break
        end

        local ck = getCk(sid)
        if ck and ck ~= '' then
            print('提取CK成功:', ck)
            return ck
        end

        retryCount = retryCount + 1

        -- 计算基础等待时间(斐波那契退避)
        local baseWait = waitCurr

        -- 在基础等待时间上增加随机值,避免多个客户端同时重试导致的"惊群效应"
        -- 添加随机抖动(±20%)
        local jitter = math.random(-20, 20) / 100
        local waitSeconds = math.floor(baseWait * (1 + jitter))
        -- 确保等待时间至少为5秒
        waitSeconds = math.max(waitSeconds, 5)

        print(waitSeconds .. ' 秒后提取CK...')
        sleep(waitSeconds * 1000)

        -- 计算下一次等待时间
        local nextWait = waitPrev + waitCurr
        if nextWait > waitMax then
            nextWait = waitMax
        end
        waitPrev = waitCurr
        waitCurr = nextWait
    end

    return nil
end
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】斐波那契数列指数退避算法在网络请求中的应用

企业级大数据智能营销管理系统

源码转让