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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
2 127
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Известно, что использование 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, локальное кеширование данных и чтение вашей активной страницы из кеша.

Другие вопросы по теме