代码之家  ›  专栏  ›  技术社区  ›  Erel Segal-Halevi

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

  •  1
  • Erel Segal-Halevi  · 技术社区  · 7 年前

    我使用 Python websockets package 。 我还用HTML+Javascript构建了一个客户端。它运行良好,我想向公众开放。

    由于我是websocket新手,我不确定当许多人同时访问websocket服务器时会发生什么:

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sepehr GH    7 年前

    第200位用户将看到什么?他会等200秒,然后看到通常的回答吗?

    当然不是。即使在HTTP示例中,服务器通常也可以同时处理一些请求。可以同时响应的请求数实际上取决于许多因素,特别是您的web服务器(或应用程序服务器)配置。由于每个请求通常都有一个线程,所以它们不会等待对方结束。除非线程池中连接的线程太多,否则Web服务器必须等待应答并关闭一个线程,才能开始处理下一个请求。

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

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

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

    使现代化 为了回答评论中的问题,我添加了此更新。

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

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

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