【问题标题】:What happens when many clients access the same websocket server simultaneously?当多个客户端同时访问同一个 websocket 服务器时会发生什么?
【发布时间】:2018-08-17 16:28:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: websocket


    【解决方案1】:

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

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

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

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

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

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

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

    如果最大会话池大小为 10,则通常无法建立第 11 个连接。根据应用服务器,可能会发生其中一种情况。

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

    【讨论】:

    • 那么,假设池中有 10 个线程和 11 个用户,第 11 个用户在尝试连接时会看到什么?
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2021-11-20
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多