У меня есть сайт Ruby on Rails, который делает HTTP-вызовы к внешней веб-службе.
Примерно раз в день я получаю электронное сообщение об ошибке SystemExit (приведено ниже: stacktrace), в котором произошел сбой вызова службы Если я потом попробую тот же самый запрос на моем сайте, то он будет работать нормально. Это происходит с тех пор, как сайт заработал, и мне не посчастливилось отследить его причины.
Ruby - это версия 1.8.6, а rails - это версия 1.2.6.
У кого-то еще есть такая проблема?
Это ошибка и трассировка стека.
Произошел SystemExit /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in exit '/usr/local/lib/ruby/gems/1.8/gems/ rails-1.2.6 / lib / fcgi_handler.rb: 116: в exit_now_handler '/usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:in to_proc '/usr/local/lib/ruby/1.8/net/protocol.rb:133:in call' /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread '/ usr / local / lib / ruby / 1.8 / net / protocol.rb: 133: в rbuf_fill '/usr/local/lib/ruby/1.8/timeout.rb:56:in timeout' /usr/local/lib/ruby/1.8/timeout. rb: 76: за время ожидания '/usr/local/lib/ruby/1.8/net/protocol.rb:132:in rbuf_fill' /usr/local/lib/ruby/1.8/net/protocol.rb:116:in readuntil '/usr/local/lib/ruby/1.8/net/protocol.rb:126:in readline' /usr/local/lib/ruby/1.8/net/http.rb:2017:in read_status_line '/ usr / local / lib / ruby / 1.8 / net / http.rb: 2006: в read_new '/usr/local/lib/ruby/1.8/net/http.rb:1047:in request' /usr/local/lib/ruby/1.8/ net / http.rb: 945: in request_get '/usr/local/lib/ruby/1.8/net/http.rb:380:i n get_response '/usr/local/lib/ruby/1.8/net/http.rb:543:in start' /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response '
Использование fcgi с Ruby, как известно, очень глючно.
По этой причине практически все переехали в Монгрель , и я рекомендую вам сделать то же самое.
Прошло некоторое время с тех пор, как я использовал FCGI, но я думаю, что процесс FCGI может вызвать SystemExit, если поток занимает слишком много времени. Это может быть веб-служба не отвечает или даже медленный запрос DNS. Некоторые результаты Google показывают аналогичную ошибку с Python и FCGI, поэтому было бы неплохо перейти на mongrel. Этот пост является моей ссылкой, которую я использовал, чтобы настроить монгрел, и я все еще возвращаюсь к нему.
Я имел обыкновение получать их все время на Apache1 / fastcgi. Я думаю, что это вызвано зависанием fastcgi до того, как Ruby готов.
Переход на дворнягу - это хороший первый шаг, но есть еще кое-что. Это плохая идея отбирать из веб-сервисов на живых страницах, особенно из Rails. Rails не является потокобезопасным. Количество одновременных соединений, которые вы можете поддерживать, равно количеству шавок (или процессов Пассажира) в вашем кластере.
Если у вас есть один дворняга, и кто-то заходит на страницу, которая вызывает веб-службу, время ожидания которой составляет 10 секунд, каждый запрос к вашему веб-сайту будет задерживаться в течение этого времени. Большинство балансировщиков нагрузки просто слепо переключают ваши шавки, поэтому, если у вас есть две шавки, все остальные запросы будут задерживаться.
Все, что может быть непредсказуемо медленным, должно происходить в очереди заданий. Первое нажатие на / slow / action добавляет задание в очередь, а / slow / action продолжает обновляться через обновления страницы или запросы через ajax до тех пор, пока задание не будет завершено, и затем вы получите результаты из очереди заданий. В настоящее время существует несколько очередей заданий для Rails, но самая старая и, вероятно, наиболее широко используемая - это BackgroundRB .
Другой альтернативой, в зависимости от характера вашего приложения, является отбраковка службы каждые N минут с помощью cron, локальное кеширование данных и чтение вашей активной страницы из кеша.
Я бы тоже взглянул на Пассажира . Намного легче начать работу, чем традиционное решение Apache / nginx + Mongrel.