2015-06-30 58 views
6

在客户端/服务器体系结构的设计过程中,将多个WEBSOCKET连接从同一进程复用到服务器(即共享一个连接)与打开一个连接每个线程/会话在客户端的WEBSOCKET连接(通常在连接到memcached或数据库服务器时完成)。设计/架构:网络插座一个连接vs多个连接

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


具体使用情况: 让我们假设,我有一面多个会话的远程服务器,并在另一边,我有多个客户端,每个客户端将通过WebSocket的服务器连接到不同的会话。 在远程服务器中,有两种实现方法:(1)每个会话创建自己的websocket连接(2)所有会话将使用相同的websocket连接。因为websocket服务器受限于可用的#of连接(节约服务器/扩展),所以我喜欢共享解决方案(一个websocket连接到所有会话)。但是从流量/数据速度/性能的角度来看,如果会话将通过连接发送大量小包,那么,如果我们使用一个共享连接,我们将无法利用带宽(有效负载。 ... /收集几个小包装成一个或将大包装拆分成小包装),因为我们可能需要从不同的会话向不同的客户发送不同的包装,在这种情况下,我们将无法收集少量包装(小包装),因为它们有不同的目的地和来自不同的来源!!,除非我们将创建“虚拟连接”来管理每个会话数据以最大限度地提高速度,但这会造成很多实现的复杂性!

还有其他意见吗?

谢谢, JB。

回答

5

我想你应该考虑使用有限的连接池,就像他们使用数据库连接体系结构一样。

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

据我所知,无论是单一连接还是使用多个连接都有问题。

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

许多连接可能会导致开销,可能会非常昂贵,以及引入更多错误的机会。考虑以下几点:

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

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

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

关于业务/数据的速度/性能,服务器架构的问题......但我相信你会真正看到通过使用一个连接(或连接的一个小型游泳池)有轻微的速度增加。请务必记住,当您需要发送TCP/IP数据包时,没有任何有效的多任务处理。

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

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

祝你好运!

+0

感谢Myst,确实有很多问题需要考虑,解决方案是基于需求(更重要的是......)。 – Joseph