I have an application which requires Heroku workers for a small percentage of time. Keeping workers running all the time in such scenario is not cost effective.
HireFire provides a service for managing Heroku resources. I participated in its beta, came out impressed and I would not hesitate to recommend it to others. What I needed however was something even simpler.
Here is the solution:
Heroku provides an api which allows, among many other things, to control number of workers. You will need to add:
to your Gemfile. Code below takes advantage of the api. Please note that the code works only with the Cedar stack.
The application uses Delayed_job gem and delayed jobs require a heroku worker to run. Here is the logic:
1. When a delayed job is started it checks if a worker is running. If it is not, a worker is launched.
2. When a job ends it checks if it is the last job running, If it is, the worker is terminated by setting the worker count to 0.
Here is the code:
This is it. Pretty simple.