3
votes

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
1
have you seen Heroku preboot in labs? devcenter.heroku.com/articles/labs-prebootJohn Beynon
I did not, and it looks great :)anthony

1 Answers

5
votes

UPDATE 2014-11-14:

Preboot is now generally available (thanks @camJackson for the bump).

Changelog entry:

New(ish) Dev Center article:


original reply

The only current means to do this is with the pre-boot lab feature:

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.