能否通过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
相关产品推荐
相关产品推荐

