2014-11-23 67 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 

});