У меня есть веб-сайт Ruby on Rails, который выполняет HTTP-вызовы внешней веб-службы.
Примерно раз в день я получаю электронное письмо с ошибкой SystemExit (stacktrace ниже), когда вызов службы не удался. Если через несколько секунд я попробую тот же запрос на своем сайте, он будет работать нормально. Это происходит с тех пор, как сайт заработал, и мне не удалось выяснить, что его вызывает.
Ruby - это версия 1.8.6, а rails - версия 1.2.6.
У кого-то еще есть такая проблема?
Это ошибка и трассировка стека.
A SystemExit occurred /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: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'





Известно, что использование fcgi с Ruby содержит множество ошибок.
Практически все перешли на Дворняга по этой причине, и я рекомендую вам сделать то же самое.
Прошло некоторое время с тех пор, как я использовал FCGI, но я думаю, что процесс FCGI может выдать SystemExit, если поток занимает слишком много времени. Это может быть веб-служба, которая не отвечает, или даже медленный DNS-запрос. Некоторые результаты Google показывают аналогичную ошибку с Python и FCGI, поэтому переход на mongrel был бы хорошей идеей. Эта почта - это моя ссылка, которую я использовал для настройки mongrel, и я до сих пор к ней возвращаюсь.
Я бы также посмотрел на Пассажир. Это намного проще, чем традиционное решение Apache / nginx + Mongrel.
Раньше я все время получал их на Apache1 / fastcgi. Я думаю, это вызвано зависанием fastcgi до того, как Ruby закончит работу.
Переход на дворняжку - хороший первый шаг, но еще многое предстоит сделать. Отбирать веб-сервисы на живых страницах, особенно из Rails, - плохая идея. Rails не является потокобезопасным. Количество одновременных подключений, которые вы можете поддерживать, равно количеству полукровок (или процессов Пассажира) в вашем кластере.
Если у вас есть одна дворняга и кто-то обращается к странице, которая вызывает веб-службу, время ожидания которой занимает 10 секунд, каждый запрос к вашему веб-сайту будет истекать в течение этого времени. Большинство балансировщиков нагрузки просто циклически перебирают ваших дворняг, поэтому, если у вас есть два дворняги, время ожидания каждого второго запроса будет истекать.
Все, что может быть непредсказуемо медленным, должно происходить в очереди заданий. Первое нажатие на / slow / action добавляет задание в очередь, а / slow / action продолжает обновляться посредством обновления страницы или запросов через ajax, пока задание не будет завершено, а затем вы получите свои результаты из очереди заданий. В настоящее время существует несколько очередей заданий для Rails, но самая старая и, вероятно, наиболее широко используемая - это ФонRB.
Другой альтернативой, в зависимости от характера вашего приложения, является отбраковка службы каждые N минут с помощью cron, локальное кеширование данных и чтение вашей активной страницы из кеша.