2010-04-19 64 views
0

我在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應用程序變得非常慢。

這是預期的嗎?或者我可以做出一些明顯的改進?

回答

2

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

根據您選擇的服務器解決方案,您可能有1,2,.. x個可用服務器線程。 (例如,當您運行腳本/服務器時,您只能獲得一個線程。) 當您「睡眠」時,服務器線程被阻止,無法服務於其他任何請求。由於線程數量有限,因此其他請求將等待運行請求完成。

您必須實現邏輯cient-side(在JS中)。您可以每秒鐘將服務器池化10次,或直到找到記錄。

一個jQuery庫可能會訣竅是jQuery Timers

相關問題