在Heroku上运行连续工作进程的最佳方法是什么?我的应用程序需要这个过程全天候运行,所以delayed_job或其他队列似乎有点矫枉过正。我可以通过Heroku控制台手动触发该过程,我可以分离它自己运行。
最好,我想将这个单一方法调用分配给一个dyno,这样当我的应用程序启动时,它会启动额外的worker-dyno,然后调用我的单个方法并开始哼唱。但不确定如何分配该方法调用?
我可以使用延迟的工作,它可以解决所有问题,但似乎我需要的是一个直接(被调用时)和未安排的单一活动。但也许这是唯一的方法。
答案 0 :(得分:2)
在您的Procfile中,您可以为额外的工作人员工作添加单独的流程
# Procfile
web: ...
worker: ...
collector: bundle exec ruby stats_collector.rb -p $PORT # or any other command
然后,您可以使用$ heroku ps:scale collector=1
扩展此流程。它将单独运行并在每次部署时停止并重新启动。我会说你的应用程序所做的事情必须是安全的,以便在任何时候使用如此长时间运行的过程中断。
如果中断可能导致问题(例如,如果重新启动,只需要完成一次,那么“传统”后台工作人员使用例如排队消息的Sidekiq可能是一种更安全的解决方案。
<强>更新强>
如果要在Rails应用程序的上下文中以非交互方式执行长时间运行的代码,可以使用rails runner命令。
# Procfile
web: ...
worker: ...
collector: bundle exec rails runner 'MyModel.my_long_running_job'