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

时间:2015-06-30 09:26:47

标签: websocket memcached

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

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

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

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

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

还有其他意见吗?

谢谢, JB。

1 个答案:

答案 0 :(得分:8)

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

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

据我所知,只有一个连接并使用大量连接都有问题。

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

许多连接可能会导致开销非常昂贵,并且会带来更多错误机会。请考虑以下事项:

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

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

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

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

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

    只需5美分,我们都会有不同的想法,我确定。

    祝你好运!