当许多客户端同时访问同一个websocket服务器时会发生什么?

时间:2018-03-09 06:44:58

标签: websocket

我使用Python websockets package构建了一个简单的websocket服务器。 我还用HTML + Javascript构建了一个客户端。它工作正常,我想向公众开放。

由于我不熟悉websockets,我不确定当很多人同时访问websocket服务器时会发生什么:

  • websocket服务器是否保留传入请求的队列并按顺序处理它们?
  • 如果是这样,websocket客户端(Javascript中的标准客户端)是否无限期地等待回复,或者是否有超时?

例如,如果200个用户同时访问HTML页面,并且每个请求需要1秒钟才能处理,第200个用户将会看到什么 - 他会等待200秒并看到通常的回复吗?

1 个答案:

答案 0 :(得分:1)

  

第200位用户会看到什么?他会等待200秒并看到通常的回复吗?

当然不是。即使在HTTP示例中,服务器通常也可以同时处理一些请求。可以同时回复的请求数实际上取决于很多事情,特别是您的Web服务器(或应用程序服务器)配置。由于每个请求通常需要一个帖子,因此他们不会等待彼此结束。除非线程池中连接的线程太多,否则Web服务器必须等待应答并关闭一个,才能开始处理下一个请求。

只有websockets存在细微差别。与无状态的HTTP不同,连接在响应发送后立即关闭,Websockets保持活动状态以与服务器交互。因此,如果每个套接字都占用一个线程,那么应用服务器仍然可以同时处理它们的请求但最大的问题是关于线程池的大小。

如果活动连接太多,通常无法建立新连接,因为池已满并且与HTTP不同,可能很快就没有新连接的开放空间。在这种情况下,应用程序服务器通常不接受新连接来处理它。

要解决此问题,您必须拥有足够的资源,并且应该找到合适的配置来处理所需的并发连接数。我不是python开发人员,但在Java和Tomcat应用程序服务器中,这通常通过正确的配置来完成,这会增加应用程序服务器的线程池大小。您必须在使用的应用程序服务器中找到相同类型的配置。

<强>更新 要回答评论中的问题,我添加此更新。

  

所以,假设池中有10个线程和11个用户,第11个用户在尝试连接时会看到什么?

如果最大会话池大小为10,则通常无法进行第11次连接。根据应用程序服务器的不同,可能会出现其中一种情况。

  • 连接一直等待连接,直到达到连接超时。
  • 服务器会立即使用某些状态代码删除新连接。有时状态代码可能是503 service unavailable
  • 它很少但服务器甚至可能会从池中删除一些活动或空闲连接并接受新连接。