设计/架构:web套接字一个连接与多个连接



在设计客户端/服务器架构期间,将同一进程到服务器的多个WEBSOCKET连接多路复用(即共享一个连接)与在客户端中每个线程/会话打开一个WEBSKET连接(通常在连接到memcached或数据库服务器时这样做)相比,有什么好处吗?

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


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

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

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

还有其他意见吗?

谢谢,JB。

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

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

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

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

许多连接可能会导致非常昂贵的开销,并带来更多出错的机会。考虑以下内容:

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

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

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

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

此外,如果连接数量有限(即使只有一个连接),您也可以从操作系统的数据包连接功能中受益,该功能允许您通过一个TCP/IP数据包发送多个网络套接字帧(除非您不断刷新TCP/IP套接字)。实际上,连接越多,就会浪费更多的带宽,甚至忽略了用于打开每个新连接的带宽。

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

祝你好运!

最新更新