sql >> データベース >  >> RDS >> Mysql

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

    イベントエミッター のデフォルトの制限 は10です。emitter.setMaxListenersを使用して増やすことができます。私の提案は、明示的に要求されない限り、そしてあなたが購読を解除しなかったのでリスナーが増えるまで、それを変更しないことです。さて、あなたのコードに移りましょう。

    const redis = require('redis');
    const config = require('../config');
    const sub = redis.createClient(config.REDIS.port, config.REDIS.host);
    const pub = redis.createClient(config.REDIS.port, config.REDIS.host);
    
    sub.subscribe('spread');
    
    module.exports = (io) => {
      io.on('connection', (socket) => {
        // this callback will be executed for all the socket connections.
        let passport =
          socket.handshake.session.passport; /* To find the User Login  */
    
        if (typeof passport !== 'undefined') {
          socket.on('typing:send', (data) => {
            pub.publish('spread', JSON.stringify(data));
          });
    
          // this is where you are subscribing for each and every socket connected to your server
          sub.on('message', (ch, msg) => {
            // this is the Exact line where I am getting this error
    
            // whereas you are emitting messages on socket manager, not on the socket.
            io.emit(`${JSON.parse(msg).commonID}:receive`, { ...JSON.parse(msg) });
          });
        }
      });
    };

    上記のコードを分析すると、サーバーへのソケット接続を20回開くと、20回サブスクライブされますが、ここでは問題が発生します。Redisで公開されたメッセージをサーバーレベルでリッスンしてから送信する必要がある場合は、 ioの場合、コードは次のようになります

    const redis = require('redis');
    const config = require('../config');
    const sub = redis.createClient(config.REDIS.port, config.REDIS.host);
    const pub = redis.createClient(config.REDIS.port, config.REDIS.host);
    
    sub.subscribe('spread');
    
    module.exports = (io) => {
      sub.on('message', (ch, msg) => {
        // this is the Exact line where I am getting this error
        io.emit(`${JSON.parse(msg).commonID}:receive`, { ...JSON.parse(msg) });
      });
    
      io.on('connection', (socket) => {
        let passport =
          socket.handshake.session.passport; /* To find the User Login  */
    
        if (typeof passport !== 'undefined') {
          socket.on('typing:send', (data) => {
            pub.publish('spread', JSON.stringify(data));
          });
        }
      });
    };


    1. ALTERTABLEステートメントがSQLServerのFOREIGNKEY制約と競合していました-SQLサーバー/TSQLチュートリアルパート69

    2. Oracleテーブル変更モニター

    3. SQLServerプロファイラーの使用| SQLServerのパフォーマンスのトラブルシューティング-5

    4. 大文字と小文字を区別するようにMysqlテーブルの列を変更する