gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:57:21 25 4
gpt4 key购买 nike

我正在使用 Node.js、带 Redisstore 的 Socket.io、来自 Socket.io 的 Cluster 和 Redis。

我有一个只在一个 Node.js Node 上运行良好的发布/订阅应用程序。但是,由于 Node.js 不是为多核机器编写的,因此当它承受重负载时,只会最大化服务器的一个核心。

正如您在下面看到的,我现在使用的是来自 Learnboost 的集群模块,也是制作 Socket.io 的人。

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

我猜我需要以某种方式将 redis 发布/订阅功能移动到 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>

最佳答案

我一直在与集群和 socket.io 作斗争。每次我使用集群功能(尽管我使用内置的 Nodejs 集群)时,我都会遇到很多性能问题和 socket.io 问题。

在尝试对此进行研究时,我一直在挖掘 socket.io git 上的错误报告和类似内容,任何在其服务器上使用集群或外部负载平衡器的人似乎都遇到 socket.io 问题。

这似乎会产生“客户端未握手的客户端应该重新连接”的问题,如果您增加详细的日志记录,您就会看到这个问题。每当 socket.io 在集群中运行时,这就会出现很多,所以我认为它会恢复到这个状态。即客户端每次建立新连接时都会连接到 socket.io 集群中的随机实例(它在授权时会建立多个 http/socket/flash 连接,而在轮询新数据时会一直建立更多连接)。

现在我已经恢复到一次只使用 1 个 socket.io 进程,这可能是一个错误,但也可能是 socket.io 构建方式的一个缺点。

补充:我将来解决这个问题的方法是为集群内的每个 socket.io 实例分配一个唯一的端口,然后在客户端缓存端口选择。

关于node.js - 我在我的集​​群 node.js/socket.io/redis pub/sub 应用程序中收到重复消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com