2014-11-23 49 views
0

我的節點應用程序突然開始消耗大量的CPU,林懷疑下面的功能卡住莫名其妙..NodeJS卡在回調中

Client.prototype.countActiveChatsRedis = function (userID, agentID, obj, callback) { 
    var count = 0; 

    pub.keys("widgetActive:" + userID + ":*", function(err, key) { 

     if(err !== null) { 
      console.log("Redis error..... --> " + err); 
      callback(count, obj);   
     } 

     if(key && key.length > 0) { 
      pub.mget(key, function(err, data) { 
       if(data) { 
        for(var i = 0; i < data.length;i++) { 
         if(data[i]) { 
          var arr = data[i].split(","); 

          if(arr[2] == agentID) { 
           if (Number(arr[3]) > 0) { 
            count++; 
           }       
          } 
         } 
        } 

        callback(count, obj); 
       } 
      });   
     } else { 
      callback(count, obj);   
     } 
    }); 
} 

任何想法是什麼問題可能是?任何情況下,它可以避免發送回調?

此函數每秒運行約50次。

回答

0

你應該總是回報你的回調,以確保您的正常工作終止,並控制返回到調用上下文:

Client.prototype.countActiveChatsRedis = function (userID, agentID, obj, callback) { 
var count = 0; 

pub.keys("widgetActive:" + userID + ":*", function(err, key) { 

    if(err !== null) { 
     console.log("Redis error..... --> " + err); 
     return callback(count, obj);   
    } 

    if(key && key.length > 0) { 
     pub.mget(key, function(err, data) { 
      if(data) { 
       for(var i = 0; i < data.length;i++) { 
        if(data[i]) { 
         var arr = data[i].split(","); 

         if(arr[2] == agentID) { 
          if (Number(arr[3]) > 0) { 
           count++; 
          }       
         } 
        } 
       } 

       return callback(count, obj); 
      } 
     });   
    } else { 
     return callback(count, obj);   
    } 
}); 
} 
+0

您是否認爲這可能是問題所在? – user3490755 2014-11-23 14:08:28

+1

不,我不知道。我只是寫了這個樂趣 – 2014-11-23 18:47:07

3

這是不好的做法,在生產環境中使用的密鑰。引用Redis主機自己:

警告:將KEYS看作是一個命令,應該只在生產環境中謹慎使用KEYS。當它針對大型數據庫執行時,它可能會破壞性能 。此命令旨在 用於調試和特種作戰,如更改密鑰空間 佈局。請勿在常規應用程序代碼中使用KEYS。如果你 尋找一種方式來找到你的密鑰空間的一個子集密鑰,可以考慮使用 掃描或套。

每當您添加一個帶有此前綴的密鑰,只需將其添加到名爲「widgetActive」的用戶的ID或您需要的任何其他數據。 如果您需要爲每個條目保存一些數據,您還可以使用HASH。

+0

你能舉一個小例子嗎? =)不知道我跟着 – user3490755 2014-11-23 14:25:25

0

它被阻塞,因爲在沒有數據的情況下,不會調用回調。

pub.mget(key, function(err, data) { 
    if(data) { 
    for(var i = 0; i < data.length;i++) { 
     if(data[i]) { 
      var arr = data[i].split(","); 

      if(arr[2] == agentID) { 
      if (Number(arr[3]) > 0) { 
       count++; 
      }       
      } 
     } 
    } 

    // callback(count, obj); // <==== move this callback outside of if (data) 
    } 
    callback(count, obj); // this ensures that callback always gets called 

});