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

能否通过Heroku Procfile启动Sidekiq任务及MigrationWorker?

如何通过Heroku Procfile运行MigrationWorker

当然可以实现,下面给你几种可行方案:

一、推送代码时自动运行(扩展release阶段)

你当前的release阶段已经在执行数据库迁移,直接把MigrationWorker的执行逻辑加进去即可,每次代码推送部署时都会自动触发。修改后的Procfile如下:

release: bin/rails db:migrate && bundle exec rails runner "MigrationWorker.perform_async"
web: bin/start-pgbouncer-stunnel bundle exec puma -p ${PORT:-3000}
worker: bundle exec sidekiq -c ${SIDEKIQ_CONCURRENCY:-5}
  • 若MigrationWorker是Sidekiq异步任务,perform_async会把任务扔进Sidekiq队列,需保证worker进程处于运行状态;
  • 若想等任务执行完成再继续部署(同步执行),可换成MigrationWorker.perform(如果worker本身是同步逻辑),或开启Sidekiq inline模式后使用perform_inline。

二、用Rake任务封装执行

先在项目的lib/tasks/migration_worker.rake文件中编写Rake任务:

namespace :workers do
  desc "执行MigrationWorker任务"
  task run_migration: :environment do
    MigrationWorker.perform_async # 此处也可替换为同步执行逻辑
  end
end

再修改Procfile的release阶段,调用这个Rake任务:

release: bin/rails db:migrate && bundle exec rake workers:run_migration
web: bin/start-pgbouncer-stunnel bundle exec puma -p ${PORT:-3000}
worker: bundle exec sidekiq -c ${SIDEKIQ_CONCURRENCY:-5}

这种方式更灵活,后续调整逻辑或单独执行任务都更方便。

三、按需手动启动(自定义进程类型)

如果不想每次推送都自动运行,可在Procfile中添加一个自定义进程:

release: bin/rails db:migrate
web: bin/start-pgbouncer-stunnel bundle exec puma -p ${PORT:-3000}
worker: bundle exec sidekiq -c ${SIDEKIQ_CONCURRENCY:-5}
migration_worker: bundle exec rails runner "MigrationWorker.perform_async"

需要运行时,通过Heroku命令手动启动:

heroku run migration_worker

或直接启动一次性dyno执行:

heroku run:once migration_worker

注意事项

  • 若MigrationWorker依赖Sidekiq,必须确保worker进程处于运行状态,否则perform_async的任务会一直留在队列中等待处理;
  • 同步执行时要留意Heroku release阶段的超时限制(默认15分钟),如果任务耗时过长,建议改用异步方式或拆分任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:10:18