0

redis チャネルにサブスクライブする簡単な通知アプリケーションを作成し、新しいメッセージがある場合、このアプリケーションはそれをユーザーに送信します。

  client.on("auth", function(sessId, userId){
      console.log('AUTH: userId ' + userId)
      var userIdFromRedis;
      redis1.get('PHPREDIS_SESSION:' + sessId, function (err , reply) {

          if (reply){
              reply = reply.toString();
              var result = reply.match(/s:2:\"id\";i:(\d+);/);

              if (result) {
                  userIdFromRedis = result[1]
                  console.log('AUTH: userIdFromRedis ' + userIdFromRedis)
              } else {
                  result = reply.match(/s:7:\"guestId\";i:(\d+);/); 
                  if (result) {
                      var guestIdFromRedis = result[1]
                      console.log('AUTH: guestIdFromRedis ' + guestIdFromRedis)
                  }
              }

              if (userIdFromRedis == userId) {
                  client.userId = userId;
                  subscribe.subscribe(channelPrefix + userId);
                  clients[userId] = client;
                  client.emit("auth", {"success":true});
                  console.log('AUTH: result - ok')
              } else if (guestIdFromRedis) {
                  client.guestId = guestIdFromRedis;
                  subscribe.subscribe(channelPrefix + guestIdFromRedis);
                  clients[guestIdFromRedis] = client;
                  client.emit("auth", {"success":true});
                  console.log('AUTH: result - ok')
              } else {
                client.disconnect();
                console.log('AUTH: result - fail')
              }
            } else {
              client.disconnect();
            }
      });
  })

  subscribe.on("message", function(channel, message) {
      var userId = Math.round(channel.substr(channelPrefix.length));
      if (client.userId == userId || client.guestId == userId) {
          console.log('Subscriber: ' + message)
          client.send(message);
      }
  });

  client.on("message", function(text){
           client.send(text);
  })

ログファイルでは、トップアワーにエラーメッセージが見つかることがあります

(ノード) 警告: EventEmitter のメモリ リークが検出された可能性があります。11人のリスナーが追加されました。制限を増やすには、emitter.setMaxListeners() を使用します。

また、node.js アプリケーションのプロセスは CPU の 90% を使用します。どうすればこの問題を解決できますか?

4

1 に答える 1

1

クライアントがサーバーに接続するたびに、別のEventEmitterをスタックに追加します。残念ながら、それらを閉じていないため、リスナーの制限である11に達しています。eventEmittersを追加するコードを追跡してから、別のステートメントを作成する必要があります。すでにクライアントが接続されている場合は、他のコードは存在しないはずです。エミッターが生成されました。

于 2012-11-19T17:58:23.887 に答える