【发布时间】:2016-11-11 13:28:27
【问题描述】:
我现在使用 socket.io 和 pm2 在集群模式下运行 node.js(默认 socket.io 聊天“hello world”示例)
var
probe = require('pmx').probe(),
app = require('express')(),
server = require('http').createServer(app),
io = require('socket.io')(server),
port = 3131 + parseInt(process.env.NODE_APP_INSTANCE),
counter = probe.counter({
name: 'User online'
});
io.on('connection', function(socket) {
counter.inc();
socket.on('disconnect', function() {
counter.dec();
});
socket.on('message', function() {
socket.emit('message', port);
});
});
server.listen(port, function() {});
和默认的 html 客户端(所有访问我的页面的人都会执行此操作)
var socket;
window.addEventListener("load", function() {
socket = io.connect('http://localhost:3000/', {
'reconnection': true,
'reconnectionDelay': 500,
'reconnectionAttempts': 3
});
socket.on('message', function(message) {
console.log(message);
});
setInterval(function() {
socket.emit('message', {});
}, 2000);
});
这与默认的 nginx 粘性会话配置一起使用(http://socket.io/docs/using-multiple-nodes/ 在这里找到,一个区别,我跳过了最后一个 redis 部分,只使用了 nginx 配置)
upstream io_nodes {
ip_hash;
server 127.0 .0 .1: 3131;
server 127.0 .0 .1: 3132;
server 127.0 .0 .1: 3133;
server 127.0 .0 .1: 3134;
server 127.0 .0 .1: 3135;
server 127.0 .0 .1: 3136;
server 127.0 .0 .1: 3137;
server 127.0 .0 .1: 3138;
}
和这样的 pm2 配置:
{
"apps": [{
"name": "server",
"script": "server.js",
"instances": 8,
"exec_mode": "cluster",
"max_memory_restart": "2G"
}]
}
我有几个问题:
首先是当我的整个项目在线用户计数时,用户在线计数更高,例如(真实案例!)如果我有 3800 个在线用户,我的关键指标(或简单的 io.eio.clientsCount)显示 4000 甚至总共有 5000 个客户端连接。
1234563有时所有节点,不仅首先乘以套接字计数。为避免这种情况,我需要杀死 pm2,稍等片刻,然后重新启动。
pm2重载后的情况(实际只有3868人在线):
【问题讨论】:
-
对于您的第一个问题,
socket.io多次向服务器发出请求。因此,Keymetrics可能会显示比预期更多的计数。我建议与他们分享这个问题。我也想知道你的第二个问题的解决方案。
标签: node.js nginx socket.io pm2