Частый выход из системы в Ruby при выполнении HTTP-вызовов - PullRequest
20 голосов
/ 02 августа 2008

У меня есть веб-сайт Ruby on Rails, который выполняет HTTP-вызовы к внешней веб-службе.

Примерно один раз в день я получаю сообщение об ошибке SystemExit (приведено ниже: stacktrace), когда произошел сбой вызова службы. Если я потом попробую тот же самый запрос на моем сайте несколько секунд спустя, он будет работать нормально. Это происходит с тех пор, как сайт заработал, и мне не посчастливилось отследить, что его вызывает.

Ruby - это версия 1.8.6, а rails - это версия 1.2.6.

Кто-нибудь еще имеет эту проблему?

Это ошибка и трассировка стека.

Произошел выход из системы /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in выход' /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in 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:in rbuf_fill ' /usr/local/lib/ruby/1.8/timeout.rb:56:in timeout ' /usr/local/lib/ruby/1.8/timeout.rb:76:in timeout ' /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:in 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:in 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 '

Ответы [ 4 ]

9 голосов
/ 02 августа 2008

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

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

8 голосов
/ 03 августа 2008

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

5 голосов
/ 30 августа 2008

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

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

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

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

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

1 голос
/ 11 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...