38

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

无论如何,如果用户要输入 2-10k 的文本并尝试发送呢?我知道我可以自己尝试一下,但我正在寻找一个实用的最佳实践限制,以限制我可以通过发射处理多少数据。

4

3 回答 3

103

从 v3 开始,socket.io 的默认消息限制为 1 MB。如果消息大于该值,则连接将被终止。

您可以通过指定maxHttpBufferSize选项来更改此默认值,但请考虑以下内容(最初是十多年前编写的,但仍然相关):

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 秒才能将 10 kB 消息传递给 5,000 个客户端。当然,在丢包和损坏数据需要重新传输的现实世界中,这将需要更长的时间。

即使非常保守的估计是 8 秒向 5,000 个客户发送 10 kB,这在每 10-20 秒收到一条消息的聊天室中也可能没问题。

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

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

回答完这些问题后,您可以确定您的基础架构将支持的最大消息大小。

于 2012-10-19T16:38:50.797 回答
3

2-10k 很好,没有任何强制限制或任何东西,它只是归结为带宽和实用性.. 10k 虽然在宏伟的计划中很小,所以如果这对你来说有点上限,你应该没问题.

于 2012-10-19T15:40:37.070 回答
1

限制 = 1M默认

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

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

阅读更多来自Socket.IO 文档

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

于 2022-01-05T20:11:56.493 回答