问题的标题可能无法解释问题。
问题是当前我们有一台快递服务器正在监听端口9095(例如)。在该服务器内部,我们实现了一个WebSocket
服务器,其路径为9095/wss
。现在,我们有大约100000
个客户端连接到该WebSocket服务器。因此,每当我们重新启动Express Server时,WebSocket就会断开连接并尝试重新连接(它写在客户端(移动应用程序)上)。每当服务器重新启动客户端的所有连接请求时,在每个连接上我们都会有4-5个mongo调用。因此,在这种情况下,对mongo
的大量并行请求的响应使我们的数据库阻塞了。
我要实现的目标是,我正在考虑将WebSocket服务器移至一个全新的进程,直到需要时才启动该服务器,并将使用IPC或其他任何方式执行所有操作。但是问题是我无法在现有客户端中更改WebSocket的路径。我可以在另一台服务器上维护相同的地址,即localhost:9095/wss
吗?请记住,服务器已经在端口9095
上运行。
或者什么是替代解决方案,以使我不必更改路径和WebSocket服务器。
什么是最好的方法?
任何帮助将不胜感激。
答案 0 :(得分:0)
您可以在此处使用redis来保存与用户ID有关的Websocket ID
类似于
{"userId1":"socketid1","userId2":"socketId2"}
,因此当您应用时 将重新启动获取ID并执行所需的操作
var ws = require('ws'),
nconf = require('nconf'),
redis = require('redis');
nconf.argv()
.env();
var server = new ws.Server({port: nconf.get('PORT')});
var sockets = {};
server.on('connection', function(socket) {
socket.on('message', function(message) {
sockets["userId"] = socket;
});
});
var db = redis.createClient(nconf.get("REDIS_PORT"), nconf.get("REDIS_HOST"));
if (nconf.get('REDIS_PASSWORD')) {
db.auth(nconf.get("REDIS_PASSWORD"));
}
db.on('message', function(channel, message) {
if (channel == 'chanel')
{
var a = message.split('>');
var socket = sockets[a[0]];
var m = a[1];
// les messages sont supposés contenir les ID utilisateurs
//var socket = sockets[message];
if (socket != undefined)
{
socket.send(m);
}
}
});
db.subscribe('channel');
console.log('listening at ws://localhost:' + nconf.get('PORT'));