gpt4 book ai didi

node.js - Socket.IO 和 Node.js 核心集群

转载 作者:IT王子 更新时间:2023-10-29 06:01:42 25 4
gpt4 key购买 nike

是否可以将 Socket.IO 与 Node 的核心集群(不是过时的模块)一起使用?

我可以 fork 多个 worker,而且看起来工作正常;但是,在打开连接时出现错误:solve: warn - client not handshaken client should reconnect

这是相关的代码片段(删除了一些简单的东西,例如 expressjs 配置):

if ( cluster.isMaster ) {
for ( var i = 0; i < numCPUs; i++ ) {
cluster.fork();
}
} else {
app.get('/', function (req, res) {
res.sendfile( __dirname + '/public/html/index.html' );
});

io.configure( function() {
var RedisStore = require('socket.io').RedisStore,
opts = { host: 'localhost', port: 8888 };

io.set('store', new RedisStore( { redisPub: opts, redisSub: opts, redisClient: opts } ));
});

app.listen( 8888 );

io.sockets.on('connection', function (socket) {
socket.emit( 'some', 'data' );
});
}

我尝试过使用和不使用 RedisStore 以及本网站上的技巧(我认为现在已经过时):http://www.danielbaulig.de/socket-ioexpress/

我还查看了 http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html 中的代码,尽管我看不出该代码与使用 MemoryStore 有何不同。

我所有的测试连接都使用 Websockets (RFC 6455)。如果我将 numCPUs 设置为等于 1,这就可以正常工作。

Node.js 版本 0.6.17Socket.io 版本 0.9.5Expressjs 版本 2.5.9

更新 - 包括控制台输出(注意,在这次尝试中连接最终成功,尽管它抛出了同样的错误):

info  - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
info - socket.io started
debug - served static content /socket.io.js
debug - client authorized
info - handshake authorized 17644195072103946664
debug - setting request GET /socket.io/1/websocket/17644195072103946664
debug - set heartbeat interval for client 17644195072103946664
debug - websocket writing 7:::1+0
warn - client not handshaken client should reconnect
info - transport end (error)
debug - set close timeout for client 17644195072103946664
debug - cleared close timeout for client 17644195072103946664
debug - cleared heartbeat interval for client 17644195072103946664
debug - discarding transport
debug - client authorized
info - handshake authorized 16098526291524652257
debug - setting request GET /socket.io/1/websocket/16098526291524652257
debug - set heartbeat interval for client 16098526291524652257
debug - websocket writing 7:::1+0
warn - client not handshaken client should reconnect
info - transport end (error)
debug - set close timeout for client 16098526291524652257
debug - cleared close timeout for client 16098526291524652257
debug - cleared heartbeat interval for client 16098526291524652257
debug - discarding transport
debug - client authorized
info - handshake authorized 13419993801561067603
debug - setting request GET /socket.io/1/websocket/13419993801561067603
debug - set heartbeat interval for client 13419993801561067603
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"some":"data","args":[11354]}
debug - websocket writing 5:::{"some":"data","args":[36448]}

这是控制台输出在失败时结束的方式(10 次中大约有 9 次失败):

info  - transport end by forced client disconnection
debug - websocket writing 0::
info - transport end (booted)
debug - set close timeout for client 1639301251431944437
debug - cleared close timeout for client 1639301251431944437
debug - cleared heartbeat interval for client 1639301251431944437
debug - discarding transport
debug - got disconnection packet
debug - got disconnection packet

更新 - 在 github 上添加了可能的门票链接:

https://github.com/LearnBoost/socket.io/issues/881

https://github.com/LearnBoost/socket.io/issues/438

最佳答案

问题似乎与 Socket.IO 自带的 Node 模块有关。

当我安装 redis (npm install hiredis redis) 并使用 redis 模块为 RedisStore 创建客户端时,一切突然变得完美。我已经使用约 500 个并发连接运行了一个多小时,没有发现任何错误,而且每个 Node 进程都在使用中。

hiredis@0.1.14redis@0.7.2

在端口 6379 上运行 Redis 2.6rc3。

更新:在 Node.s 0.8 中,集群库看起来应该更加成熟,因此上述代码/问题可能会过时:http://nodejs.org/docs/v0.7.8/api/cluster.html

关于node.js - Socket.IO 和 Node.js 核心集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544350/

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