我很想知道有关HTML WebSockets可扩展性的任何信息。根据我所读的内容,每个客户端都将与服务器保持开放的通信线路。我只是想知道这如何扩展以及服务器可以处理多少个开放的WebSocket连接。也许在现实中保持这些连接不是问题,但它感觉像是一个问题。
在大多数方面,WebSockets 可能比 AJAX/HTML 请求更具有伸缩性。然而,这并不意味着 WebSockets 可以代替所有使用 AJAX/HTML 的情况。
每个 TCP 连接本身在服务器资源方面消耗很少。经常设置连接可能很昂贵,但维护空闲连接几乎是免费的。通常遇到的第一个限制是可以同时打开的最大文件描述符数(套接字消耗文件描述符)。这通常默认为1024,但很容易配置得更高。
试过将 Web 服务器配置为支持数万个同时的 AJAX 客户端吗?把这些客户端变成 WebSockets 客户端,这可能是可行的。
HTTP 连接虽然不会长时间创建打开文件或消耗端口号,但在几乎每个其他方面都更加昂贵:
每个 HTTP 连接携带了很多很少使用的内容:cookies、content type、content length、user-agent、服务 id、日期、last-modified 等等。一旦建立了 WebSockets 连接,只有应用程序需要发送和接收的数据才会来回传输。
通常,HTTP 服务器被配置为记录每个 HTTP 请求的开始和完成,占用磁盘和 CPU 时间。将记录 WebSockets 数据的开始和完成变为标准,但是在 WebSockets 连接进行双向传输时,不会有任何额外的日志记录开销(除非应用程序/服务设计成这样)。
通常,使用 AJAX 的交互式应用程序要么持续轮询,要么使用某种长轮询机制。WebSockets 是一种更加清洁(和低资源)的方式,可以使用更多事件模型,在现有连接上服务器和客户端互相通知彼此,当他们有报告内容时。
绝大多数生产环境中常用的Web服务器都有一个进程(或线程)池来处理HTTP请求。随着压力的增加,池的大小将会增加,因为每个进程/线程一次只能处理一个HTTP请求。每个额外的进程/线程使用更多的内存,而创建新的进程/线程比创建新的套接字连接要昂贵得多(这些进程/线程仍然必须执行该操作)。现在,大多数流行的WebSocket服务器框架都采用事件驱动的路线,这倾向于扩展和性能更好。
WebSocket的主要优点是互动式Web应用程序具有更低的延迟连接。它将比HTTP AJAX/long-poll更好地扩展和消耗更少的服务器资源(假定应用程序/服务器被正确设计),但我认为WebSocket的主要优点是较低的延迟,因为它将使新的Web应用程序类别成为可能,而这是现有的AJAX/long-poll的高开销和延迟所不可能实现的。
一旦WebSocket标准变得更加完善并获得更广泛的支持,对于需要频繁与服务器通信的大多数新交互式Web应用程序来说,使用它将是合理的。对于现有的交互式Web应用程序,这将取决于当前AJAX/long-poll模型的运行情况。转换的工作量是不小的,因此在许多情况下,成本就不值得收益。
更新:
需要澄清的是:在这种情况下,服务器可以支持的客户端连接数与端口无关,因为服务器通常只在一个单一端口上侦听WS/WSS连接。其他评论者想要引用的应该是文件描述符。您可以将最大文件描述符数量设置得很高,但是您必须注意每个打开的TCP/IP套接字的套接字缓冲区大小累加的情况。以下是一些附加信息:https://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system
至于通过WS相对于HTTP减少延迟,这是真的,因为除了初始WS握手之外,不再解析HTTP头文件。此外,随着越来越多的数据包被成功发送,TCP拥塞窗口扩大,有效地缩短了往返时间。
在实践中,完整的WebSockets应用程序无法很好地扩展。只需将WebSockets用于它们的设计目的:从服务器向客户端推送通知。因此,我建议对于任何项目采取以下措施:
- 仅使用WebSockets进行客户端通知(带有回退机制以进行长轮询-周围有很多库);
- 使用RESTful / JSON处理所有其他数据,使用CDN或代理进行缓存。
不,它不能扩展,会给中间路由交换机带来巨大的工作量。然后在服务器端,页面故障(您必须保留所有这些描述符)达到了很高的值,并且将资源带入工作区域的时间增加了。这些服务器大多是用JAVA编写的,保持那些亿万个套接字可能比销毁/创建一个更快。 当您在计算机上运行此类服务器时,任何其他进程都无法移动。