ノードのコア クラスタ (古いモジュールではない) で Socket.IO を使用することは可能ですか?
複数のワーカーをフォークできますが、うまく機能しているようです。ただし、接続を開くと、次のエラーが表示されます。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のコードも見ましたが、そのコードがメモリストアを使用。
テスト接続はすべて Websocket (RFC 6455) を使用しています。numCPUs を 1 に設定すると、これは正常に機能します。
Node.js バージョン 0.6.17 Socket.io バージョン 0.9.5 Expressjs バージョン 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 の可能性のあるチケットへのリンクを追加しました: