设计/架构:web-socket一个连接与多个连接

Jos*_*eph 8 memcached websocket

在设计客户端/服务器体系结构时,将多个WEBSOCKET连接从同一进程多路复用到服务器(即共享一个连接)与在客户端中为每个线程/会话打开一个WEBSOCKET连接是否有任何优势(通常在连接到memcached或数据库服务器.)

我知道与每个连接相关的开销(例如RAM ......).但预计每个客户端的最多不到1K-10K.


具体用例:假设我有一台远程服务器,一边有多个会话,另一边我有多个客户端,每个客户端都会通过websocket服务器连接到不同的会话.在远程服务器中,有两种方法可以实现它:(1)每个会话创建自己的websocket连接(2)所有会话将使用相同的websocket连接.

从连接的角度来看,我喜欢共享解决方案(一个websocket连接到所有会话),因为websocket服务器受#of可用连接的限制(保存服务器/扩展).

但从流量/数据速度/性能的角度来看,如果会话将通过连接发送大量小包,那么,如果我们使用一个共享连接,我们将无法利用带宽(有效载荷.... /将少量小包收集到一个或将大包拆分成小包),因为我们可能必须从不同的会话向不同的客户端发送不同的包,在这种情况下,我们将无法收集少量包(小包),因为他们有不同的目的地和来自不同的来源!!,除非我们将创建管理每个会话数据的"虚拟连接"以最大化速度,但这会产生很多实现复杂性!

还有其他意见吗?

谢谢,JB.

Mys*_*yst 8

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

我会考虑的另一个解决方案是Pub/Sub数据库中间人,例如Redis.这使您可以使用现有解决方案以及更轻松的可扩展性.

据我所知,只有一个连接和使用多个连接都有问题.

例如,一个连接一次只能发送一条消息.一个足够大的消息可以阻止连接...你移动大数据?

许多连接可能导致开销,这可能非常昂贵,并且会引入更多错误机会.考虑以下:

  1. 创建新连接非常昂贵,使用带宽,遭受更长的网络延迟并需要本地资源,这正是websockets允许我们避免的.

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

  3. 请记住,每个操作系统都有一个打开文件限制,并且websockets使用IO体系结构(每个都是一个'open-file',因此websockets是一个有限的资源).

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

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

只要我5美分,我们都会有不同的想法,我敢肯定.

祝好运!

  • @JonathanLee - 计算应该类似于 TCP/IP 吞吐量,因为解析数据包的 CPU 开销相对于网络开销通常可以忽略不计。例如,请参阅这个 [TCP/IP 吞吐量计算器](https://www.switch.ch/network/tools/tcp_throughput/)(有很多)。根据您的客户端和服务器 TCP/IP 缓冲区限制,在达到 13 Mbits/Sec(每秒略低于 2MB)之前,您可能不需要另一个连接...这对于流式传输(压缩的)全高清可能已经足够了电影,但 4K 电影需要服务器套接字的额外缓冲区。 (2认同)