我应该期待Comet这么慢吗?

时间:2010-04-19 18:29:28

标签: ruby-on-rails comet

我在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 个答案:

答案 0 :(得分:2)

嗯..这不是最好的方法。

根据您选择的服务器解决方案,您可能拥有1,2,... x可用的服务器线程。 (例如,当您运行脚本/服务器时,您只能获得一个线程。) 当您“睡眠”时,服务器线程被阻止,无法为任何其他请求提供服务。由于线程数有限,其他请求会“等待”运行请求完成。

您必须实现逻辑cient端(在JS中)。您可以每秒将服务器池化10次,或者直到找到记录。

可以解决问题的jQuery库是jQuery Timers