28

我即将在本地计算机上托管一个小型套接字服务器,我想知道它将使用什么样的带宽。在大多数情况下,它一次连接的客户端不超过 50 个,但每周一次或两次它可以同时连接多达 5,000 多个客户端。但是,发送的唯一消息将是偶尔向所有连接的客户端发送一条消息,没有额外的数据或任何东西。

服务器是否会导致其托管的计算机的性能显着下降或完全减慢我的互联网速度?

服务器.js:

var app = require('http').createServer(handler)
   , io = require('socket.io').listen(app)
   , fs = require('fs')

 app.listen(8001);

function handler (req, res) {
fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.on('SendDefault', function(data) {
    socket.broadcast.emit('GetDefault');
  });
});

客户端.js:

setTimeout( function( ){ 
  socket = io.connect('[IP Address]:8001');
  socket.on('GetDefault', function(data) {
    DoStuff( );
  );
} ); }, 10000 );
4

2 回答 2

70

带宽量在很大程度上取决于您要从服务器发送的数据量,以及客户端将发送的数据量。带宽使用还取决于您使用的 Socket.IO 传输方式以及应用程序的心跳间隔。

应用程序的性能影响还因您正在运行的应用程序类型以及您的机器和/或网络的性能能力而异。但是,无论您的计算机功能如何,5000 多个客户端都会对性能产生相当大的影响,除非您跨多个内核扩展应用程序。

我使用代理进行了一些测量。结果如下:

从客户端发出socket.emit(event, args)

  • 如果eventargs未提供,则将 12 个字节发送到服务器。
  • 如果args省略但event提供,则总大小为 22 个字节,长度为event.
  • 如果提供argsevent,则遵循相同的规则,但结果可能会因 的数据类型而异args

从服务器发出:与来自客户端的格式相同

  • 如果eventargs未提供,则将 8 个字节发送到客户端。
  • 如果args省略但event提供,则总大小为 17 个字节,长度为event.
  • 如果提供argsevent,则遵循相同的规则,但结果可能会因 的数据类型而异args

服务器到客户端心跳:每个客户端每 25 秒

  • 来自服务器的 5 个字节
  • 9 个字节的客户端响应

握手:每个客户一次

  • 来自服务器的 216 个字节
  • 来自客户端的 431 字节响应
  • 129 字节从服务器跟进

因此,对于超过 5000 个客户端的负载,握手至少需要 3.7MB,心跳需要 3KB/s,. socket.emit(). 这些不是确切的数字,因为客户端可能会丢失数据、断开连接、需要重新连接等。

最后,您的网络可能会坚持下去,但主要关注的应该是您的网络必须处理的并发连接量。许多并发连接也可能是 CPU 密集型的,因此您应该考虑跨内核集群。还要记住 Socket.IO 服务器必须处理的心跳数量。对于 50 个并发用户,平均每秒 2 次心跳。在 5000 多个并发用户时,每秒有 200 多个心跳,我认为这比网络密集型 (2.8KB/s) 更占用 CPU。

于 2013-09-20T01:42:51.797 回答
2

WebSockets 可以保持打开很长时间,因此处理大量并发连接通常意味着您需要扩展该服务以适应增加的负载。这对于几乎所有技术来说都是一样的,但是在事情迅速走下坡路之前,服务器可以处理的最大打开连接数通常是有限制的。如果您可能会遇到这样的流量高峰,我会考虑研究像pusherkaazing这样的第三方服务(免责声明:我还没有尝试过。)

您发布了一个非常模糊的问题(我们对您的应用程序、体系结构等一无所知 - 只是预期的流量),但希望这有助于为您指明正确的方向。话虽这么说...根据您的用例(偶尔广播一两条小消息),我的直觉告诉我 WebSockets 不是适合您的技术。

(请注意,带宽可能不应该成为问题——一般来说,如果您要通过 WebSockets 与 REST 相比发送许多消息,由于标头、cookie 等,您将发送更少的数据。)

于 2013-09-20T01:59:29.240 回答