Heroku每日dyno重启是否会中断多日运行的Sidekiq任务?
Heroku Dyno重启对Sidekiq长时任务的影响及解决方案
核心结论
Heroku的每日dyno重启会中断运行时间超过30秒的Sidekiq任务,哪怕是官方提到的优雅重启机制,也不会等待数日级别的长任务完成。
原因解析
- Heroku优雅重启的硬限制:当dyno触发重启(包括每日自动重启)时,Heroku会先向进程发送
SIGTERM信号,随后启动30秒的优雅关闭窗口。如果进程在30秒内未自行终止,Heroku会强制发送SIGKILL信号杀死进程——这个30秒窗口是固定的,无法延长至数小时或数日。 - Sidekiq的 shutdown 逻辑:Sidekiq收到
SIGTERM后,会立刻停止从队列拉取新任务,并尝试完成当前运行的任务。但如果当前任务的运行时间超过30秒,Sidekiq进程仍会被Heroku强制终止,未完成的任务会被标记为失败(默认配置下会自动重试,但重试可能引发重复执行或数据不一致问题)。
长时任务的可行解决方案
- 拆分任务为小单元:将耗时数日的大任务拆分为多个独立小任务(每个任务运行时间控制在20秒以内,留足缓冲),比如按数据批次拆分。这样每次dyno重启时,当前小任务能在30秒窗口内完成,后续任务继续在队列等待执行。
- 实现进度 checkpoint:在任务运行过程中,定期将进度(如已处理的数据ID、完成阶段)保存到Redis或数据库中。当任务因重启中断后,下次执行时从保存的进度点继续,避免重复处理或从头开始。
- 更换更稳定的运行环境:如果任务必须连续运行,可考虑使用Heroku Private Spaces(提供更低频率的强制重启),或者将长时任务迁移到专门的批处理服务,再通过Sidekiq触发和监控任务状态。
内容的提问来源于stack exchange,提问作者existentialmutt
相关产品推荐
相关产品推荐

