我可以通过socket.emit发送多少数据?

cbm*_*eks 29 node.js socket.io

所以我使用的是node.js和socket.io.我有这个小程序,它获取文本框的内容并将其发送到node.js服务器.然后,服务器将其中继回其他连接的客户端.有点像聊天服务但不完全一样.

无论如何,如果用户输入2-10k的文本并尝试发送该怎么办?我知道我可以尝试一下并亲自看看,但我正在寻找一个实际的,最佳实践限制我可以通过发射做多少数据.

jos*_*736 74

Node和socket.io没有任何内置限制.您需要担心的是消息大小,每秒发送的消息数,连接的客户端数量以及服务器可用带宽之间的关系 - 换句话说,没有简单的答案.

我们考虑一个10 kB的消息.当连接10个客户端时,这相当于服务器必须推出的100 kB数据,这是完全合理的.添加更多客户端,事情变得更加苛刻:10 kB*5,000客户端= 50 MB.

当然,您还必须考虑协议开销的数量:每个数据包,TCP增加~20个字节,IP增加20个字节,以太网增加14个字节,总共54个字节.假设MTU为1500字节,您将看到每个客户端8个数据包(忽略重新传输).这意味着您将通过线路发送每个客户端8*54 = 432字节的开销+ 10 kB有效负载= 10,672字节.

10.4 kB*5000客户端= 50.8 MB.

在100 Mbps链路上,如果您能够使链路饱和,那么您正在寻找理论上至少 4.3秒的时间来向5,000个客户端发送10 kB消息.当然,在丢包的现实世界和需要重传的损坏数据中,需要更长的时间.

即使有一个非常保守的估计8秒发送10 kB到5,000个客户端,这在聊天室中可能很好,每隔10-20秒会有一条消息.

所以真的,它归结为几个问题,按重要性顺序排列:

  1. 您的服务器可用多少带宽?
  2. 将同时连接多少用户?
  3. 每分钟会发送多少条消息?

回答这些问题后,您可以确定基础架构支持的邮件的最大大小.

  • 这是一个很棒的答案。感谢您在较低级别上的解释。但是每个客户端的 8 个数据包是从哪里来的呢?另外,出于某种原因,我认为套接字有 512 字节或类似的限制。不知道我从哪里得到的。哈哈。谢谢 (4认同)
  • 就其本质而言,数据包是串行发送的——所有数据都必须作为字节流发送。由于 IP 路由的性质,这些数据包可能不会以正确的顺序*到达*,但您永远不必担心这一点,因为 TCP 的工作是确保在将数据传递给数据之前将数据包重新组合成正确的顺序应用程序。 (3认同)
  • 当以太网 [MTU](http://en.wikipedia.org/wiki/Maximum_transmission_unit) 为 1500 B 时,每个数据包的最大有效负载大小为 1500 B - 40 B(TCP+IP 开销)= 1460 B。要发送 10,240 B的数据,必须至少发送 8 个数据包(1460*7 = 10220 - 不够;还有 20 个字节要发送。1460*8 = 11,680)。 (2认同)

Eyn*_*ave 8

限制 = 1M默认

使用此示例配置指定maxHttpBufferSize的自定义限制:

const io = require("socket.io")(server, {
    maxHttpBufferSize: 1e8, pingTimeout: 60000
});
Run Code Online (Sandbox Code Playgroud)
  • 1e8 = 100,000,000:这对于任何大规模响应/发射都有好处
  • pingTimeout:当发射量很大时,需要时间,并且您也需要增加 pingtime

从Socket.IO 文档中阅读更多内容

经过这些设置,如果您的问题仍然存在,那么您可以检查相关的代理Web服务器配置,例如nginx中的 client_max_body_sizelimit_rate(如果您有与socketIO应用程序相关的http代理)或客户端/服务器防火墙规则。