项目背景
在某个游戏测试的项目中,需要从服务器获取登录的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.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】斐波那契数列指数退避算法在网络请求中的应用
飞云脚本圈: 586333520

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