在Heroku上运行连续运行的工作进程

在Heroku上运行连续工作进程的最佳方法是什么? 我的应用程序需要这个过程全天候运行,所以delayed_job或其他队列似乎有点矫枉过正。 我可以通过Heroku控制台手动触发该过程,我可以分离它自己运行。

最好,我想将这个单一方法调用分配给一个dyno,这样当我的应用程序启动时,它会启动额外的worker-dyno,然后调用我的单个方法并开始哼唱。 但不确定如何分配该方法调用?

我可以使用延迟的工作,它可以解决所有问题,但似乎我需要的是一个直接(当被调用)而没有安排的单一活动。 但也许这是唯一的方法。

在您的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'