Render部署Telegram Bot三小时后触发ConnectionResetError故障求助
问题分析与解决方案
你的Telegram Bot在Render平台运行约3小时后触发ConnectionResetError(104, 'Connection reset by peer'),重启后故障重复出现,添加固定sleep无法解决。核心原因大概率是长连接闲置被断开、请求频率触发目标服务限流或Render平台的连接策略限制,以下是针对性解决方案:
实现带指数退避的请求重试机制
固定sleep无法应对动态的限流或临时连接波动,改用指数退避的重试逻辑,同时捕获各类请求异常:import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # 配置重试策略 session = requests.Session() retry_strategy = Retry( total=3, backoff_factor=1, # 指数退避间隔:1s → 2s → 4s status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["GET"] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) # 使用session发起请求 try: r = session.get(get_url(name), headers=headers, timeout=10) r.raise_for_status() # 主动触发HTTP状态码错误 soup = bs(r.content, features='html.parser') except requests.exceptions.RequestException as e: # 记录错误日志,必要时给Telegram用户返回提示 print(f"请求失败: {str(e)}")给Telegram Bot添加心跳保活
Telegram Bot的长连接若长时间闲置,可能被Render的负载均衡或防火墙断开,添加定时心跳任务保持连接活跃:import time from telegram import Update from telegram.ext import Updater, CallbackContext def keep_alive(context: CallbackContext): # 定期发送getMe请求维持连接 try: context.bot.get_me() print("心跳包发送成功,连接保持活跃") except Exception as e: print(f"心跳包发送失败: {str(e)}") # Bot初始化时添加定时任务,每15分钟执行一次 updater = Updater("YOUR_BOT_TOKEN") job_queue = updater.job_queue job_queue.run_repeating(keep_alive, interval=900, first=0) # 900秒=15分钟排查Render平台的服务限制
- 查看Render控制台的Metrics面板,检查CPU、内存及连接数是否达到套餐阈值
- 检查Bot进程是否存在连接泄漏问题,确保每次请求后正确关闭session,避免连接池耗尽
优化请求头部与频率控制
- 不要用固定sleep,改为根据目标服务的响应调整间隔,比如收到429限流错误时延长等待时间
- 完善请求头部,添加真实的User-Agent、Referer等字段,模拟正常浏览器请求,避免被目标服务识别为爬虫断开连接
内容的提问来源于stack exchange,提问作者TheAtef
相关产品推荐
相关产品推荐

