假设服务器获得10,000个并发连接(通过socket.io).这是很多,如果它不能再处理,我需要启动另一台服务器.
如何将这两个服务器与socket.io同步?
目前,我面临的任务是必须使用Amazon EC2扩展Node.js应用程序.根据我的理解,这样做的方法是让每个子服务器使用集群使用所有可用的进程,并具有粘性连接,以确保"记住"连接到服务器的每个用户关于他们当前数据的工作者以前的会议.
完成此操作之后,我所知道的下一个最佳方法是根据需要部署尽可能多的服务器,并使用nginx在所有服务器之间进行负载平衡,再次使用粘性连接来了解每个用户数据所在的"子"服务器.
因此,当用户连接到服务器时,会发生什么?
客户端连接 - >查找/选择服务器 - >查找/选择进程 - > Socket.IO握手/连接等.
如果没有,请允许我更好地理解这种负载平衡任务.我也不明白redis在这种情况下的重要性.
下面是我用来在一台机器上使用所有CPU的代码,用于单独的Node.js进程:
var express = require('express');
cluster = require('cluster'),
net = require('net'),
sio = require('socket.io'),
sio_redis = require('socket.io-redis');
var port = 3502,
num_processes = require('os').cpus().length;
if (cluster.isMaster) {
// This stores our workers. We need to keep them to be able to reference
// them based on source IP address. It's also useful for auto-restart,
// for example.
var workers = [];
// Helper function for spawning worker …Run Code Online (Sandbox Code Playgroud) 我正在创建一个Web应用程序,需要将少量数据(每个插槽3个整数值)从服务器发送到客户端非常频繁,我想看看是否有使用Socket.IO更新客户端的最大频率.
我希望至少实现50个套接字连接,每个连接每秒发送20个更新.理想的数字是200个套接字连接,每秒发送50个更新.
问题:使用Socket.IO发送新数据的频率是否有限制?
注意:我认识到这也成为服务器 - 客户端连接的速度问题,因此我需要了解有关连接速度的任何信息.我计算出,如果发送的每个数据包大约是500字节,那么我将能够在1 MB/s连接上每秒发送20次更新到100个连接.
我在使用Node.js,socket.io和node.js集群集群我的应用程序时遇到问题.
我使用socket.io-redis来共享所有工作人员的信息,但是无法正常工作.
我的代码:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
...
var express = require("express");
//Server
var server = express();
//Socket.io
var http = require('http').Server(server);
var io = require('socket.io')(http);
var redis_io = require('socket.io-redis');
var redis = require("redis");
io.adapter(redis_io({host: "127.0.0.1", port: 6379 }));
...
}
Run Code Online (Sandbox Code Playgroud)
在客户端,我得到握手错误,如400错误或WebSocket在建立连接之前关闭. …
基于这个答案的问题:https://stackoverflow.com/a/18650183/4478897
我试图找到这个解决方案,但似乎没有任何东西可以按照我需要的方式工作.
集群expressjs,socket.io我们可以使用redis共享会话并io在ioworld(io.sockets.on('connection',...)内发送消息.问题是我们是想socket.join/leave在expressjs世界里发送消息(或使用简单的)(route.get/post).
如果我们不使用集群,我们可以atach客户socket对象明确request对象(或简单地export在io对象),然后在任何GET/POST路线随时使用它.
在另一方面,如果我们的集群和使用所提到的方法来获取socket里面的对象expressjs世界,有时socket对象,因为未定义socket此客户端对象在其他初始化worker.
一些示例流程:
worker 1处理此请求.socket.io.Worker 2处理此连接.worker 1或worker X处理此请求.在这种情况下,当客户端执行POST时,只worker 2知道socket该客户端的对象.所以这将得到一个未定义的socket对象.
那么,问题是:
我们如何socket从任何客户端对象中获取worker它以在expressjs request对象上重用它. …