Что я могу сделать с ошибками unicorn:: clientshutdown в моем приложении raki geelu?

У меня есть приложение, которое принимает загрузки изображений. Это приложение rails 3 на героку, использующее Unicorn. Иногда я получаю исключения unicorn::clientshutdown, и я не знаю, что их вызывает или как их обрабатывать. Что мне делать?

Это мой файл unicorn.rb:

before_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
    Rails.logger.info('Disconnected from ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end
end

after_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
    Rails.logger.info('Connected to ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = ENV['REDIS_URI']
    Rails.logger.info('Connected to Redis')
  end
end

Ответ 1

Загрузка изображений, Heroku и Unicorn, о мой.

Проблема

Это trifecta для этой ошибки. Вероятно, существует коррелирующая ошибка H12 (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) в ваших журналах Heroku. То, что происходит, заключается в том, что запрос слишком долго заканчивается (у Heroku есть нерешенный 30-секундный тайм-аут), поэтому он отключился, и рабочий-единорог был убит. Кроме того, Unicorn не подходит для медленных/длительных запросов (см. http://rainbows.rubyforge.org)

Решение

Фокус в том, чтобы загрузить изображение на интерфейсе без попадания на сервер (CORS/AJAX/jquery.fileupload.js/etc), передав это загруженное местоположение файла вместе с отправкой формы, а затем выполнив любую обработку позже как фоновая работа и повторная загрузка, которая не подпадает под 30-секундный тайм-аут. Другие более подробно рассказали об этом. Кроме того, вы можете использовать такую ​​услугу, как Cloudinary, для этого.

PS

YMMV, но вы должны добавить это в свою конфигурацию единорога (https://devcenter.heroku.com/articles/rails-unicorn)

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
  # ...
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end
  # ...
end