当前位置: 首页 > 面试题库 >

我在群集的node.js / socket.io / redis pub / sub应用程序中收到重复的消息

侯涵煦
2023-03-14
问题内容

我正在使用Node.js,带有Redisstore的Socket.io,来自Socket.io的集群以及Redis。

我有一个发布/订阅应用程序,仅在一个Node.js节点上运行良好。但是,当它承受沉重的负担时,它最多只能耗尽服务器的一个核心,因为Node.js并不是为多核计算机编写的。

如您在下面看到的,我现在使用的是Learnboost的Cluster模块,这是制造Socket.io的人。

但是,当我启动4个工作进程时,进入并订阅的每个浏览器客户端都会获得Redis中发布的每个消息的4个副本。如果有三个工作进程,则有三个副本。

我猜我需要以某种方式将redis pub / sub功能移动到cluster.js文件。

Cluster.js

var cluster = require('./node_modules/cluster');

cluster('./app')
  .set('workers', 4)
  .use(cluster.logger('logs'))
  .use(cluster.stats())
  .use(cluster.pidfiles('pids'))
  .use(cluster.cli())
  .use(cluster.repl(8888))
  .listen(8000);

App.js

redis = require('redis'),
sys = require('sys');

var rc = redis.createClient();

var path = require('path')
  , connect = require('connect')
  , app = connect.createServer(connect.static(path.join(__dirname, '../')));

// require the new redis store
var sio = require('socket.io')
  , RedisStore = sio.RedisStore
  , io = sio.listen(app);

io.set('store', new RedisStore);io.sockets.on('connection', function(socket) {
    sys.log('ShowControl -- Socket connected: ' + socket.id);

    socket.on('channel', function(ch) {
        socket.join(ch)
        sys.log('ShowControl -- ' + socket.id + ' joined channel: ' + ch);
    });

    socket.on('disconnect', function() {
        console.log('ShowControll -- Socket disconnected: ' + socket.id);
    });
});

rc.psubscribe('showcontrol_*');

rc.on('pmessage', function(pat, ch, msg) {
    io.sockets.in(ch).emit('show_event', msg);
    sys.log('ShowControl -- Publish sent to channel: ' + ch);
});

// cluster compatiblity
if (!module.parent) {
  app.listen(process.argv[2] || 8081);
  console.log('Listening on ', app.address());
} else {
  module.exports = app;
}

client.html

<script src="http://localhost:8000/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script>
    var socket = io.connect('localhost:8000');
    socket.emit('channel', 'showcontrol_106');
    socket.on('show_event', function (msg) {
        console.log(msg);
        $("body").append('<br/>' + msg);
    });
</script>

问题答案:

原来这不是Node.js / Socket.io的问题,我只是用完全错误的方式来解决它。

我不仅从Node /
Socket堆栈外部发布到Redis服务器,而且仍然直接订阅Redis频道。在发布/订阅情况的两端,我都绕过了“后端带有Redis存储的Socket.io群集”的优点。

因此,我创建了一个小应用程序(使用Node.js / Socket.io /
Express),该应用程序从Rails应用程序中接收消息,并使用socket.io-
announce模块将其“宣布”到Socket.io房间中。现在,通过使用Socket.io路由魔术,每个节点工作人员将仅获取消息并将消息发送到直接与其连接的浏览器。换句话说,由于pub和sub都发生在Node.js
/ Socket.io堆栈中,因此不再有重复的消息。

清理代码后,我将在github上的地方放一个示例



 类似资料:
  • 问题内容: 可以说我在 四个 工作进程(伪)上具有以下内容: 在浏览器上… 问题: 由于四个独立的工作进程发送消息,因此我每秒收到 四条 消息。 如何确保邮件仅发送一次? 问题答案: 编辑: 在Socket.IO 1.0+中,现在可以使用更简单的Redis适配器模块,而不是通过多个Redis客户端设置存储。 下面显示的示例看起来更像这样: 如果您有一个主节点需要发布到其他Socket.IO进程,但

  • 问题内容: —我构建了一个简单的应用程序,该应用程序从Redis数据库中提取数据(50个项目)并将其扔到localhost。我做了一个ApacheBench(c = 100,n = 50000),并且在1.73GHz(我的6岁笔记本电脑)的双核T2080上获得了半不错的150个请求/秒,但是proc的使用非常令人失望显示: 仅使用了一个内核,这是按照Node中的设计进行的,但是我认为,如果我可以使

  • 我刚接触android开发。我正在构建一个应用程序,有一个部分,可以从我的应用程序发送消息到特定的whatsapp号码,回复可以从whatsapp发送回我的应用程序。请问这可能吗。 我读过从我的应用程序向whatsapp发送消息的文章,但没有看到从whatsapp回复到我的android应用程序的文章 我在用Android Studio。提前谢了。

  • 我正在尝试使用node.js、socket.io和express制作一个简单的聊天应用程序。但是,如果我单击main.jade文件中的send按钮,页面会刷新,并且不会出现任何消息。我在Firebug中也遇到这个错误: 加载页面时,与ws:/127.0.0.1:3000/socket.io/?eio=2&transport=websocket&sid=d_hnmpdxhed-j7lraaah的连接

  • 它会无止境地重复。此外,我在订阅关系图中看到消息仍然存在(在确认回调调用之后) 丢弃逻辑: 我不知道如何排除故障。有什么想法吗?

  • 把我的城市飞艇升级到7.2。没有编译错误和应用程序运行良好,直到它收到一个推送消息。此时,它将崩溃,出现以下堆栈跟踪: 当我检查类是否可见(Cmd-O)并开始键入时,类立即出现。 有人遇到过这个吗?我不知道怎么修好它。多谢了。