Частый выход из системы в Ruby при выполнении HTTP-вызовов

У меня есть сайт 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 '

2.08.2008 17:26:39
4 ОТВЕТА
РЕШЕНИЕ

Использование fcgi с Ruby, как известно, очень глючно.

По этой причине практически все переехали в Монгрель , и я рекомендую вам сделать то же самое.

9
2.08.2008 17:50:34

Прошло некоторое время с тех пор, как я использовал FCGI, но я думаю, что процесс FCGI может вызвать SystemExit, если поток занимает слишком много времени. Это может быть веб-служба не отвечает или даже медленный запрос DNS. Некоторые результаты Google показывают аналогичную ошибку с Python и FCGI, поэтому было бы неплохо перейти на mongrel. Этот пост является моей ссылкой, которую я использовал, чтобы настроить монгрел, и я все еще возвращаюсь к нему.

8
9.01.2013 05:47:56

Я имел обыкновение получать их все время на Apache1 / fastcgi. Я думаю, что это вызвано зависанием fastcgi до того, как Ruby готов.

Переход на дворнягу - это хороший первый шаг, но есть еще кое-что. Это плохая идея отбирать из веб-сервисов на живых страницах, особенно из Rails. Rails не является потокобезопасным. Количество одновременных соединений, которые вы можете поддерживать, равно количеству шавок (или процессов Пассажира) в вашем кластере.

Если у вас есть один дворняга, и кто-то заходит на страницу, которая вызывает веб-службу, время ожидания которой составляет 10 секунд, каждый запрос к вашему веб-сайту будет задерживаться в течение этого времени. Большинство балансировщиков нагрузки просто слепо переключают ваши шавки, поэтому, если у вас есть две шавки, все остальные запросы будут задерживаться.

Все, что может быть непредсказуемо медленным, должно происходить в очереди заданий. Первое нажатие на / slow / action добавляет задание в очередь, а / slow / action продолжает обновляться через обновления страницы или запросы через ajax до тех пор, пока задание не будет завершено, и затем вы получите результаты из очереди заданий. В настоящее время существует несколько очередей заданий для Rails, но самая старая и, вероятно, наиболее широко используемая - это BackgroundRB .

Другой альтернативой, в зависимости от характера вашего приложения, является отбраковка службы каждые N минут с помощью cron, локальное кеширование данных и чтение вашей активной страницы из кеша.

5
30.08.2008 04:55:25

Я бы тоже взглянул на Пассажира . Намного легче начать работу, чем традиционное решение Apache / nginx + Mongrel.

1
11.08.2008 16:36:06