You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Heroku免费层内仅保持Worker Dyno处于活跃状态?

让Heroku免费层Worker Dyno保持活跃,同时Web Dyno休眠的解决方案

首先得明确Heroku免费层的核心规则:如果你的应用同时有Web和Worker Dyno,只要Web Dyno因30分钟无请求进入休眠,关联的Worker Dyno也会跟着休眠——哪怕Worker的任务队列里还有待处理的任务。这就是你之前尝试重启Worker、缩扩容都没用的原因,Worker的休眠状态是和同应用的Web Dyno绑定的。

下面是符合你需求的可行方案:

方案一:将Worker和Web拆分为独立的Heroku应用

这是最直接的解决办法,拆分后两个应用完全独立,Worker Dyno的休眠状态不再受Web Dyno影响:

  • 把Worker相关的代码(任务队列、处理逻辑等)单独抽出来,创建一个新的Heroku应用进行部署。
  • 原应用保留Web Dyno,它可以正常在30分钟无请求后进入休眠,不会影响到独立的Worker应用。
  • 对于独立的Worker应用,要保持它活跃的话:
    • 如果你的Worker一直在处理队列任务,只要任务不断,Dyno就不会休眠;
    • 如果队列可能出现空窗期,可以在Worker代码里添加一个内部定时任务,每隔25分钟执行一个轻量的活跃操作(比如打印一条日志、触发一个空的任务处理函数)。这种操作不需要外部请求,也不需要暴露API密钥,完全在Worker进程内部完成,就能让Heroku认为Dyno处于活跃状态,避免休眠。

举个简单的Python示例(用schedule库):

import schedule
import time
import logging

def keep_worker_alive():
    logging.info("Keeping worker dyno active...")

# 每隔25分钟执行一次
schedule.every(25).minutes.do(keep_worker_alive)

# 在任务处理的主循环里同时运行定时任务
while True:
    schedule.run_pending()
    # 这里是你的Worker任务处理逻辑,比如监听队列
    time.sleep(1)

为什么之前的方法无效?

你尝试的重启Dyno、先缩再扩容Dyno,本质上只是重置了Worker的状态,但因为同应用的Web Dyno已经进入休眠,Heroku的机制会让Worker Dyno在30分钟后依然跟着休眠,无法打破这种绑定关系。

不推荐的方案(避坑)

  • 外部监控工具:需要持续检查状态、暴露API密钥,还无法延长30分钟的休眠窗口,正如你所说,应该尽量避免。
  • 保持Web Dyno活跃:这会连带让Worker活跃,但不符合你希望Web Dyno闲置的需求。

内容的提问来源于stack exchange,提问作者thisismydesign

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:46:10