如何通过Heroku Scheduler结合curl命令定时执行pg:killall清除Postgres事务中卡住的空闲连接
解决方案:用Heroku Scheduler + curl定时执行pg:killall
Hey Bobby, 很高兴能帮你解决这个问题!针对你想在dynos重启30分钟后清除卡住的数据库连接需求,其实完全可以通过Heroku Scheduler + curl调用Heroku API实现,而且不需要复杂的Python脚本,刚好避开你提到的超级用户权限问题。下面是具体的实现步骤:
一、核心思路:两个独立的定时任务
你已经在使用Heroku Scheduler定时重启dynos,只需要再添加一个延迟30分钟的任务,专门执行pg:killall操作。Heroku的pg:killall命令是平台封装好的,不需要你拥有Postgres超级用户权限,它会帮你安全地终止所有卡住的空闲连接(包括事务中的)。
二、具体curl命令实现
你可以用curl直接调用Heroku平台API来执行pg:killall命令,和你重启dynos的逻辑类似。需要用到你的Heroku API令牌,以及目标应用的名称:
- 获取你的Heroku API令牌:可以在Heroku账户设置里找到,或者通过
heroku auth:token命令在本地终端获取。 - 构造curl命令:
curl -X POST \ -H "Authorization: Bearer $HEROKU_API_KEY" \ -H "Content-Type: application/json" \ https://api.heroku.com/apps/你的应用名称/ps/exec \ -d '{ "command": "heroku pg:killall --app 你的应用名称", "attach": false }'
三、在Heroku Scheduler中配置任务
- 打开Heroku Dashboard,进入你的应用,找到Scheduler插件。
- 添加一个新的定时任务:
- 选择合适的频率(比如和你重启dynos的频率一致,但时间延后30分钟)
- 把上面的curl命令粘贴进去,注意替换
你的应用名称,并且在Scheduler的环境变量里设置HEROKU_API_KEY(避免明文暴露令牌)
- 保存任务即可。
四、注意事项
- 时区设置:确保Heroku Scheduler的时区和你重启dynos的时区一致,避免时间偏差导致任务执行时机不对。
- 测试验证:先手动执行一次curl命令,确认
pg:killall能正常清除卡住的连接,再配置到Scheduler中。 - 关于pg:killall的影响:这个命令会终止所有数据库连接,但你是在dynos重启30分钟后执行,此时旧的dynos已经关闭,新的dynos建立的连接都是正常的,所以不会影响正常业务。
为什么不用Python脚本?
正如你所说,Heroku Postgres不提供超级用户权限,用Python脚本需要查询pg_stat_activity视图,然后手动终止连接,这不仅需要处理权限限制,还要过滤出真正卡住的连接,逻辑复杂且容易出错。而直接调用Heroku的pg:killall命令是最简洁可靠的方式,平台已经帮你处理了权限和连接筛选的问题。
内容的提问来源于stack exchange,提问作者Bobby Gindal
相关产品推荐
相关产品推荐

