feat: 限制解除后增加15分钟缓冲期再重试

问题:
- 限制解除后立即重试,可能再次触发速率限制
- 没有缓冲时间,容易导致连续失败

修复:
- 限制解除后,增加15分钟缓冲期
- 缓冲期内不申请证书,避免立即重试
- 优化检查间隔计算,在缓冲期结束后才重试

实现:
- should_request_cert: 检查缓冲期,缓冲期内返回 False
- run: 计算重试时间时加上15分钟缓冲期
- 实际重试时间 = 限制解除时间 + 15分钟

优势:
- 避免立即重试再次触发限制
- 给 Let's Encrypt 足够的恢复时间
- 提高证书申请成功率
This commit is contained in:
jingrow 2026-01-01 20:31:54 +00:00
parent a5ccb1f951
commit 3478db383e

View File

@ -179,9 +179,16 @@ class RouteWatcher:
logger.debug(f"域名 {domain} 仍在速率限制期间,剩余约 {remaining_minutes} 分钟后重试")
return False
else:
# 限制已解除,移除记录
del self.rate_limited_domains[domain]
logger.info(f"域名 {domain} 速率限制已解除,将重新尝试申请证书")
# 限制已解除但再等待15分钟缓冲时间避免立即重试再次触发限制
buffer_seconds = 15 * 60 # 15分钟缓冲
if current_time < retry_after + buffer_seconds:
remaining_minutes = int((retry_after + buffer_seconds - current_time) / 60) + 1
logger.debug(f"域名 {domain} 限制已解除,等待缓冲期,剩余约 {remaining_minutes} 分钟后重试")
return False
else:
# 缓冲期已过,移除记录,允许重试
del self.rate_limited_domains[domain]
logger.info(f"域名 {domain} 速率限制和缓冲期已过,将重新尝试申请证书")
return True
@ -271,7 +278,29 @@ class RouteWatcher:
while True:
try:
self.process_new_domains()
time.sleep(interval)
# 计算下次检查时间:如果有速率限制的域名即将解除,提前检查
next_check_interval = interval
current_time = time.time()
buffer_seconds = 15 * 60 # 15分钟缓冲时间
# 检查是否有即将解除限制的域名(包括缓冲期)
for domain, retry_after in list(self.rate_limited_domains.items()):
# 计算到可以重试的时间(限制解除时间 + 15分钟缓冲
actual_retry_time = retry_after + buffer_seconds
if actual_retry_time <= current_time:
# 限制和缓冲期都已过,下次检查时处理
continue
else:
# 计算到可以重试的时间
time_until_retry = actual_retry_time - current_time
if time_until_retry < next_check_interval:
# 在可以重试时检查,而不是等到正常检查周期
next_check_interval = max(1, min(time_until_retry + 1, interval)) # +1 秒缓冲至少1秒
time.sleep(next_check_interval)
except KeyboardInterrupt:
logger.info("收到停止信号,退出服务")
break