Стоит ли ожидать, что комета будет такой медленной? - PullRequest
0 голосов
/ 19 апреля 2010

У меня есть следующее в контроллере Rails:

def poll
  records = []
  start_time = Time.now.to_i

  while records.length == 0 do
    records = Something.uncached{Something.find(:all,
        :conditions => { :some_condition => false})}

    if records.length > 0
      break
    end

    sleep 1

    if Time.now.to_i - start_time >= 20
      break
    end
  end

  responseData = []

  records.each do |record|
    responseData << {
      'something' => record.some_value
    }

    # Flag message as received.
    record.some_condition = true
    record.save
  end

  render :text => responseData.to_json
end

и затем у меня есть Javascript, выполняющий запрос AJAX. Запрос находится там в течение 20 секунд или пока метод контроллера не найдет запись в базе данных, ожидая. Это работает.

function poll() {
  $.ajax({
    url: '/my_controller/poll',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: 'time=' + new Date().getTime(),
    success: function(response) {
      // show response here
    },
    complete: function() {
      poll();
    },
    error: function() {
      alert('error');
      poll();
    }
  });
}

Когда в моем браузере открыто 5-10 вкладок, мое веб-приложение становится очень медленным.

Этого и следовало ожидать? Или есть какие-то очевидные улучшения, которые я могу сделать?

1 Ответ

2 голосов
/ 19 апреля 2010

Хорошо .. Это не лучший подход.

В зависимости от того, какое серверное решение вы выберете, у вас может быть 1,2, ... x доступных серверных потоков. (Например, когда вы запускаете скрипт / сервер, вы получаете только один поток.) Когда вы «спите», поток сервера блокируется и не может обрабатывать любые другие запросы. Поскольку номер потока ограничен, другие запросы «ждут», пока не будет завершен текущий запрос.

Вы должны реализовать логику cient-side (в JS). Вы можете объединять сервер 10 раз в секунду или до тех пор, пока не будет найдена запись.

Библиотека jQuery, которая может добиться цели: Таймеры jQuery .

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