0

node、socket.io、および redis を使用してメッセージ キューを実装しようとしています。Here で概説されている信頼できるキュー パターンに従おうとしています。ログファイル (サイズ 60M) を行ごとに読み取り (これは後で変更します)、後で処理するために行をキューに入れようとしています。ただし、メモリ割り当ての問題が発生しています。この問題のトラブルシューティング方法がわかりません。どこから始めればよいかについてのガイダンスが必要です。問題がファイルの読み取りにあるのか、redis クライアントにあるのかはわかりません。次のように、キューにメッセージを 1 つずつ追加できました。

socket.emit('message', 'some sort of log line here');

したがって、リスナーが機能していることはわかっていますが、socketClient.js ファイルを実行すると、少しスピンアウトし、最終的に次の一般的なエラー メッセージで失敗します。

致命的なエラー: JS の割り当てに失敗しました - プロセスがメモリ不足です

これが失敗している場所に関する詳細情報を取得するために追加できるエラー処理またはプロファイリングはありますか?

コードは次のとおりです。

socketListener.js

var util = require("util"),
redis = require("redis"),
io = require('socket.io').listen(8088)

client = redis.createClient("7777", "localhost");

util.log("Established connection to redis");

io.sockets.on('connection', function(socket) {

    util.log("socket connection established for socket : " + socket);

    socket.on('message', function (data) {
         util.log("received the following data : ");
         util.log(JSON.stringify(data, 0, 3));
         client.on("error", function(err) {
            util.log("Error " + err);
        });

        try {
            // reliable queue pattern implementation
            util.log("queuing up the data in the list");
            client.rpush('logList', data);
            client.brpoplpush('logList', 'dequeueList', 10); 
        } catch (err) {
            util.log("An error occurred : ");
            util.log(JSON.stringify(err, 0, 3));
        }
    });

    socket.on('disconnect', function() {});

});

socketClient.js

var io = require("socket.io-client");
var socket = io.connect('http://localhost:8088');
var redis = require('redis');
var util = require('util');
var fs = require('fs');
var readline = require('readline');

socket.on('connect', function() {
client = redis.createClient("7777", "localhost");   
    var rd = readline.createInterface({
    input: fs.createReadStream('someLogFile.log'),
    terminal: false
    });

rd.on('line', function(line) {
    util.log("reading line " + line);
    socket.emit('message', line);
});

    client.lrange('dequeueList', 0, -1, function(err, results) {
        if (err) {
           util.log(err);
        } else {
            var multi = client.multi();
            for (var i=0; i < results.length; i++) {
                util.log('got : ' + results[i]);
                multi.hgetall(results[i]);
            }
            multi.exec(function(err, logs) {
                util.log("executing the multi commands");
                util.log(JSON.stringify(logs, 0 ,3));
            })
        };
    });

})

助けてくれてありがとう!

4

0 に答える 0