diff --git a/ssl_manager/route_watcher.py b/ssl_manager/route_watcher.py index b299873..332098e 100755 --- a/ssl_manager/route_watcher.py +++ b/ssl_manager/route_watcher.py @@ -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