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

Heroku每日dyno重启是否会中断多日运行的Sidekiq任务?

Heroku Dyno重启对Sidekiq长时任务的影响及解决方案

核心结论

Heroku的每日dyno重启会中断运行时间超过30秒的Sidekiq任务,哪怕是官方提到的优雅重启机制,也不会等待数日级别的长任务完成。

原因解析

  1. Heroku优雅重启的硬限制:当dyno触发重启(包括每日自动重启)时,Heroku会先向进程发送SIGTERM信号,随后启动30秒的优雅关闭窗口。如果进程在30秒内未自行终止,Heroku会强制发送SIGKILL信号杀死进程——这个30秒窗口是固定的,无法延长至数小时或数日。
  2. Sidekiq的 shutdown 逻辑:Sidekiq收到SIGTERM后,会立刻停止从队列拉取新任务,并尝试完成当前运行的任务。但如果当前任务的运行时间超过30秒,Sidekiq进程仍会被Heroku强制终止,未完成的任务会被标记为失败(默认配置下会自动重试,但重试可能引发重复执行或数据不一致问题)。

长时任务的可行解决方案

  • 拆分任务为小单元:将耗时数日的大任务拆分为多个独立小任务(每个任务运行时间控制在20秒以内,留足缓冲),比如按数据批次拆分。这样每次dyno重启时,当前小任务能在30秒窗口内完成,后续任务继续在队列等待执行。
  • 实现进度 checkpoint:在任务运行过程中,定期将进度(如已处理的数据ID、完成阶段)保存到Redis或数据库中。当任务因重启中断后,下次执行时从保存的进度点继续,避免重复处理或从头开始。
  • 更换更稳定的运行环境:如果任务必须连续运行,可考虑使用Heroku Private Spaces(提供更低频率的强制重启),或者将长时任务迁移到专门的批处理服务,再通过Sidekiq触发和监控任务状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:42:31