带有 socket.io 和 expressjs 的节点集群
Posted
技术标签:
【中文标题】带有 socket.io 和 expressjs 的节点集群【英文标题】:node cluster with socket.io and expressjs 【发布时间】:2012-08-18 12:01:23 【问题描述】:这是我的服务器代码:
我正在尝试将集群与 socket.io 和 expressjs 一起使用。我正在我的四核桌面上对此进行测试。
var cluster = require('cluster')
var numCPUs = require('os').cpus().length
if (cluster.isMaster)
// Fork workers.
for (var i = 0; i < numCPUs; i++)
cluster.fork()
console.log(new Date());
else
// get required modules
var connect = require('connect');
var express = require('express');
var mongo = require('mongodb');
var MongoStore = require('connect-mongo')(express);
var server;
var redis = require('redis');
var http = require('http');
// create server object
app = exports.module = express();
function configureServer()
//configure environments
app.configure('production', function()
app.use(express.errorHandler());
);
//configure server instance
app.configure(function()
app.use(express.compress())
// set jade as default view engine
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.cookieParser("refdgfd"));
app.use(express.methodOverride());
app.use(app.router);
// use express logger
);
loadModules();
var server = http.createServer(app).listen(80);
socket = require('socket.io').listen(server);
var RedisStore = require('socket.io/lib/stores/redis')
, pub = redis.createClient()
, sub = redis.createClient()
, client = redis.createClient();
socket.set('store', new RedisStore(
redisPub : pub
, redisSub : sub
, redisClient : client
));
socket.configure(function()
socket.set('log level', 1);
socket.set('transports', ['websocket']);
);
configureServer();
有什么明显错误的地方吗?
日志表明一切都发生了 4 次。这似乎是正确的。但是我的 socket.io 的频道用户也表明,每当我连接到一个页面时,我都会连接 4 次,(创建 4 个用户套接字)。这似乎是错误的。我该如何修复它,我的代码是否还有其他问题。谢谢。
【问题讨论】:
我也有同样的问题。核心数中的重复消息。我已经尝试了所有的组合,但没有运气。你找到解决办法了吗? 【参考方案1】:目前socket.io
不完全支持node.js cluster
。使用websocket
传输对我来说效果很好,但xhr-pooling
失败了。您可以在此问题中获得更多信息:#939、#917。问题是xhr-pooling
请求可以进入与最初授权的线程不同的线程。
【讨论】:
谢谢,我实际上只使用 websocket,忽略了在我的代码中包含它,我现在已经更新了。 xhr-polling 除了这里提到的问题之外还有一些问题,websocket 一般通过 SSL 是可靠的。以上是关于带有 socket.io 和 expressjs 的节点集群的主要内容,如果未能解决你的问题,请参考以下文章
expressJS 和 socket.io 监听不同的端口和 socket.io 客户端连接
socket.io+redis+expressjs 集群 - 在 expressjs 请求中获取套接字对象
如何在同一个端口上使用 ExpressJS 和 Socket.io?