2010-04-19 5 views
0

Je donne les résultats suivants dans un contrôleur Rails:Dois-je m'attendre à ce que Comet soit aussi lente?

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 

puis je Javascript effectuer une requête AJAX. La requête reste là pendant 20 secondes ou jusqu'à ce que la méthode du contrôleur trouve un enregistrement dans la base de données, en attente. Ça marche.

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(); 
    } 
    }); 
} 

Lorsque 5 à 10 onglets sont ouverts dans mon navigateur, mon application Web devient très lente.

Est-ce normal? Ou y a-t-il des améliorations évidentes que je peux faire?

Répondre

2

Bien .. Ce n'est pas la meilleure approche. En fonction de la solution de serveur que vous choisissez, vous pouvez avoir 1,2, ... x threads de serveur disponibles. (Par exemple, lorsque vous exécutez un script/serveur, vous n'obtenez qu'un seul thread.) Lorsque vous dormez, le thread du serveur est bloqué et ne peut pas recevoir d'autres requêtes. Comme le nombre de threads est limité, d'autres requêtes 'attendent' que la requête en cours soit terminée.

Vous devez implémenter le côté cient logique (dans JS). Vous pouvez mettre le serveur en pool 10 fois par seconde ou jusqu'à ce qu'un enregistrement soit trouvé.

Une bibliothèque jQuery pouvant faire l'affaire est jQuery Timers.

Questions connexes