петля ruby ​​rails вызывает зависание сервера - PullRequest
1 голос
/ 14 апреля 2010

Я работаю над проектом Ruby on Rails для Windows. У меня установлены Ruby 1.86 и Rails 2.35. Все хорошо, пока я не попытался реализовать кометный процесс. У меня есть следующий код, написанный для ответа на длинный запрос javascript опроса. Но каждый раз, когда вызывается эта функция, она будет зависать весь сервер rails, второй запрос не может войти, пока не истечет время ожидания. (Я знаю, что есть джаггернаут, но сначала я бы хотел реализовать его сам):

Это связано с настройкой моего сервера? Проект будет развернут на сервере Linux с настройкой Ngix и Passenger, будет ли он испытывать ту же проблему?

def comet_hook
    timeout(5) do
      while true do
        key = 'station_' + station_id.to_s + '_message_lastwrite'      
        if Rails.cache.exist?(key) 
          @cache_time = DateTime.parse(Rails.cache.read(key))
          if @cache_time > hook_start
            @messages = @station.messages_posted_after(hook_start)
            hook_start = @cache_time
            break
          end 
        end
    end
    ...
end

Также с кешем хранилища памяти Rails я получаю ошибку «невозможно изменить замороженный объект», поэтому приведенный выше скрипт работал только для меня, когда я переключился на кэш файлов. (

1 Ответ

0 голосов
/ 14 апреля 2010

Ваша установка Windows, вероятно, состоит из одного webrick или mongrel экземпляра, который может обрабатывать только одно соединение за раз.

Установки Passeger и nginx могут (и обычно будут), конечно,разместить несколько одновременных сеансов через кластер процессов веб-сервера (будь то кластер mongrel позади nginx или кластер рабочих процессов Passenger Apache), если он настроен для этого (значение конфигурации servers для mongrelкластеров, MaxClients для Apache / Passenger.)

Масштабирование числа одновременных клиентских сессий и / или системной памяти на основе ожидаемого трафика (например, если вы ожидаете 10 запросов в секунду, где каждый запрос может занимать до5 или более для обслуживания, вам нужно будет разместить 50 или более клиентских подключений, т.е. 50 или более серверов Mongrel в кластере или 50 или более рабочих процессов Apache - с нетривиальными требованиями к памяти.)

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