Heroku zero-downtime deployment with Unicorn
heroku, unicorn
Solution
UPDATE 2014-11-14:
Preboot is now generally available (thanks @camJackson for the bump).
Changelog entry:
- https://devcenter.heroku.com/changelog-items/544
New(ish) Dev Center article:
- https://devcenter.heroku.com/changelog-items/544
original reply
The only current means to do this is with the pre-boot lab feature:
- Heroku Labs: preboot
Preboot is a work in progress.
Note that using Unicorn doesn't have any impact here. The preloading in that context is the master process preloading the Rails app before forking workers; this happens after the new dynos are spun up and cycled out.
Problem
I was wondering if it's possible to have a zero-downtime deployment strategy with Heroku. I find with the current Heroku docs, that upon pushing an app, it takes about 1 minute to reload the app, which makes it unusable. The unicorn code in their documentation does preload the app, so I'm confused why this is happening. Is there anything I can do on my end? https://devcenter.heroku.com/articles/rails-unicorn I have the new relic addon as well as bonsai for elastic search. Here is my unicorn.rb initializer: ``` # config/unicorn.rb worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3) timeout 15 preload_app true before_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn master intercepting TERM and sending myself QUIT instead' Process.kill 'QUIT', Process.pid end defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| Signal.trap 'TERM' do puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' end defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end ```