我应该期待Comet这么慢吗?
问题描述:
我在Rails控制器执行以下操作:我应该期待Comet这么慢吗?
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个选项卡时,我的web应用程序变得非常慢。
这是预期的吗?或者我可以做出一些明显的改进?
答
嗯..这不是最好的方法。
根据您选择的服务器解决方案,您可能有1,2,.. x个可用服务器线程。 (例如,当您运行脚本/服务器时,您只能获得一个线程。) 当您“睡眠”时,服务器线程被阻止,无法服务于其他任何请求。由于线程数量有限,因此其他请求将等待运行请求完成。
您必须实现逻辑cient-side(在JS中)。您可以每秒钟将服务器池化10次,或直到找到记录。
一个jQuery库可能会诀窍是jQuery Timers。