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 ```

Original source