【问题标题】:redis-server offline crashes noderedis-server 离线崩溃节点
【发布时间】:2016-08-23 14:23:47
【问题描述】:

我在这里玩得很开心。我已经阅读了这么多文档,以及其他人关于同一主题的问题,但找不到关于如何阻止这种情况发生的答案。我特意关闭了 redis 服务器,以确保应用程序在生产过程中不会完全变成核,但我似乎没有做任何事情来阻止这种情况的发生。这是我现在的代码的一个非常简单的示例...

var cluster = require('cluster');
var express = require('express');
var http = require('http');
var redis = require('redis');
var redisAdapter = require('socket.io-redis');
var sticky = require('sticky-session');
var port = process.env.PORT || 3333;
var workers = 3;
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);

if(!sticky.listen(server, 3333, {workers: workers})) {
    server.once('listening', () => {
        console.log('server started on port ' + port);
        process.on('exit', () => {
            io.emit('error', {errorType: 'SERVER_SHUTDOWN'});
        });
        process.on('uncaughtException', (err) => {
            console.log('uncaught exception occurred');
            console.log(err);
        });
    });
} else {
    addRedisAdapter(io);
    addIOEventHandler(io);
}

function addRedisAdapter(io) {
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379';
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl);
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true});
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true});
    io.on('error', (err) => {
        console.log(err);
    });
    io.on('uncaughtException', (err) => {
        console.log(err);
    });
    io.adapter(redisAdapter({pubClient: pub, subClient: sub}));
    console.log('redis adapter started');
}
function addIOEventHandler(io) {
    //all the events for io
}

现在,我启动 redis-server,然后用这个服务器启动 node.js。然后我打开一个终端窗口并输入“redis-cli shutdown”来强制redis服务器下线。一旦我这样做,node.js 终端窗口就会发疯,一遍又一遍地循环相同的错误。

events.js:154
  throw er; // Unhandled 'error' event
  ^

Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
    at Object.exports._errnoException (util.js:893:11)
    at exports._exceptionWithHostPort (util.js:916:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1075:14)
redis adapter started with url: redis://127.0.0.1:6379

我有两个 process.on('uncaughtException' ... 和 io.on('uncaughtException' ... 以及一个 io.on('error', ... 处理程序,但每次服务器只是坐在那里循环说有一个“未处理的'错误'事件” 有人可以帮我吗?我看不出这怎么可能是未处理的错误,出于某种原因,这在我看来没有意义。 提前感谢您提供的任何可能的帮助。我已经在互联网上几个小时试图找到任何其他可能的选项,他们都说同样的话,使用 io.on('error', or io.on('uncaughtException', or process.on('uncaughtException' ,我拥有它们,但它仍然会出错并导致节点崩溃。

【问题讨论】:

  • 尝试在客户端添加错误处理,即 pub.on("error", (err) => { console.log(err) });
  • @SadiRubaiyet 当我添加 pub.on('error'... // 未处理的“错误”事件 ^ 错误:Redis 连接到 127.0.0.1:6379 失败 - 在 Exports._exceptionWithHostPort (util.js) 的 Object.exports._errnoException (util.js:893:11) 处连接 ECONNREFUSED 127.0.0.1:6379 :916:20) 在 TCPConnectWrap.afterConnect [as oncomplete] (net.js:1075:14)
  • 很棒的人,乐于助人。此外,您可以在出错时使用 client.end 或 client .quit,甚至可以设置驱动程序 github page 中描述的重试策略

标签: javascript node.js socket.io socket.io-redis redis-server


【解决方案1】:

感谢@SadiRubaiyet 为我指明了正确的方向。我不得不向 pub 和 sub 添加一个错误事件。一旦我这样做了,当 redis 出现故障时,就不会再有节点崩溃了。这是编辑后的代码...

var cluster = require('cluster');
var express = require('express');
var http = require('http');
var redis = require('redis');
var redisAdapter = require('socket.io-redis');
var sticky = require('sticky-session');
var port = process.env.PORT || 3333;
var workers = 3;
var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);

if(!sticky.listen(server, 3333, {workers: workers})) {
    server.once('listening', () => {
        console.log('server started on port ' + port);
        process.on('exit', () => {
            io.emit('error', {errorType: 'SERVER_SHUTDOWN'});
        });
        process.on('uncaughtException', (err) => {
            console.log('uncaught exception occurred');
            console.log(err);
        });
    });
} else {
    addRedisAdapter(io);
    addIOEventHandler(io);
}

function addRedisAdapter(io) {
    var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379';
    var redisOptions = require('parse-redis-url')(redis).parse(redisUrl);
    var pub = redis.createClient(redisOptions.port, redisOptions.host, { returnBuffers: true});
    var sub = redis.createClient(redisOptions.port, redisOptions.host, {returnBuffers: true});
    io.on('error', (err) => {
        console.log(err);
    });
    io.on('uncaughtException', (err) => {
        console.log(err);
    });
    /*HERE IS THE NEW CODE THAT MADE IT WORK*/
    pub.on('error', (err) => {
        console.log('error from pub');
        console.log(err);
    });
    sub.on('error', (err) => {
        console.log('error from sub);
        console.log(err);
    });
    /*END*/
    io.adapter(redisAdapter({pubClient: pub, subClient: sub}));
    console.log('redis adapter started');
}
function addIOEventHandler(io) {
    //all the events for io
}

【讨论】:

    【解决方案2】:

    我使用这一行解决了这个问题:

     io.of('/').adapter.on('error', function(error){
              console.log('error: ', error);            
           });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多