设计/架构:Web Socket 单连接 vs 多连接

20
在设计客户端/服务器架构时,将多个WEBSOCKET连接复用到同一进程与服务器(即共享一个连接)是否比在客户端中每个线程/会话打开一个WEBSOCKET连接(通常连接到memcached或数据库服务器时所做的方式)更有优势?
我知道每个连接都会带来额外的开销(例如RAM...)。但预计每个客户端最多只有1K-10K。
具体使用案例:假设我有一个远程服务器,在一侧有多个会话,在另一侧有多个客户端,每个客户端都会通过websocket服务器连接到不同的会话。在远程服务器上,有两种实现方法:(1)每个会话创建自己的websocket连接 (2)所有会话将使用相同的websocket连接。
从连接角度来看,我喜欢共享解决方案(一个websocket连接到所有会话),因为websocket服务器受可用连接数限制(节约服务器/扩缩性)。
但从流量/数据速度/性能角度来看,如果会话将通过连接发送大量小数据包,则如果我们使用一个共享连接,我们将无法利用带宽(有效载荷.../收集几个小数据包成一个大数据包或拆分大数据包成小数据包),因为我们可能需要将不同的数据包发送到不同的客户端和不同的会话,此时,我们将无法收集少量数据包(小数据包),因为它们有不同的目标和来源!!除非我们创建"虚拟连接"来管理每个会话数据以最大化速度,但这将造成很多实现复杂性!!
还有其他意见吗?
谢谢, JB。
1个回答

18

我认为你应该考虑使用有限的连接池,就像数据库连接架构一样。

另一个我会考虑的解决方案是使用 Pub/Sub 数据库中间件,例如 Redis。这允许您使用现有的解决方案以及更容易的可伸缩性。

据我所知,使用单个连接和使用多个连接都有自己的问题。

例如,一个连接一次只能发送一个消息。足够大的消息可能会阻塞连接...你是在传输大数据吗?

许多连接可能会导致开销非常昂贵,同时增加更多的错误机会。请考虑以下内容:

  1. 创建新连接非常耗费资源,使用带宽,遭受网络延迟更长,并需要本地资源,而这正是 websocket 可以帮我们避免的。

  2. 您将遇到可扩展性问题。例如,Heroku 将 websocket 连接限制为每台服务器 600 个,或者至少在短时间内是这样(我认为这是合理的)...您如何将所有服务器连接到一个数据存储?

  3. 请记住,每个操作系统都有一个打开文件限制,而 websocket 使用 IO 架构(每个 websocket 都是一个“打开文件”,因此 websocket 是一种有限的资源)。

关于流量/数据速度/性能,这是服务器架构的问题...但我相信使用一个连接(或小连接池)实际上会看到轻微的速度增加。重要的是要记住,在需要发送 TCP/IP 数据包时,没有任何有效的多任务处理。

此外,使用有限数量的连接(甚至只有一个连接),您将能够受益于操作系统的分组数据包功能,这将允许您在一个 TCP/IP 数据包中发送多个 websocket 帧(除非您不断刷新 TCP/IP 套接字)。您实际上会浪费更多的带宽 - 即使忽略用于打开每个新连接的带宽。

以上仅供参考,我们肯定会有不同的想法。

祝你好运!


谢谢Myst,确实有很多问题需要考虑,解决方案基于需求(什么更重要...)。 - Joseph
@Myst,您是否了解有什么通用的规则可以确定应使用多少个Websocket连接才能同时享受数据包组合和其他限制连接的好处,同时具有比一个连接更好的吞吐量?例如,(#会话)/3或其他数值? - Jonathan Lee
2
@JonathanLee - 计算应该类似于TCP/IP吞吐量,因为解析数据包的CPU开销通常相对于网络开销来说是可以忽略不计的。例如,可以查看此TCP/IP吞吐量计算器(还有很多其他工具可用)。根据您客户端和服务器的TCP/IP缓冲区限制,您可能在达到13 Mbits/Sec之前就不需要另一个连接(每秒不到2MB)。这对于流式传输(经过压缩的)全高清电影可能已经足够了,但是4K电影将需要服务器套接字的额外缓冲区。 - Myst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接