许多像Caplin这样的Comet实现提供可扩展的服务器解决方案。
以下是来自Caplin网站的其中一项统计数据:
单个Caplin Liberator实例可以支持多达100,000个客户端,每个客户端每秒接收1条消息,并且平均延迟小于7ms。
与任何Web服务器上的HTML5 WebSocket相比如何?有人可以向我指出任何HTML 5 WebSocket的统计数据吗?
许多像Caplin这样的Comet实现提供可扩展的服务器解决方案。
以下是来自Caplin网站的其中一项统计数据:
单个Caplin Liberator实例可以支持多达100,000个客户端,每个客户端每秒接收1条消息,并且平均延迟小于7ms。
与任何Web服务器上的HTML5 WebSocket相比如何?有人可以向我指出任何HTML 5 WebSocket的统计数据吗?
声明 - 我在Caplin工作。
这个页面上有一些错误信息,所以我想尝试让它更清晰明了。
我认为我们可以将我们谈论的方法分为三类..
我把它们都看作是Comet,因为Comet只是一种范式,但自从WebSocket出现以来,一些人想将其视为不同或替代Comet-但它只是另一种技术-除非你满意仅支持最新的浏览器,否则不能仅依赖WebSocket。
就性能而言,大多数基准测试集中在服务器到客户端的消息上-用户数量,每秒消息数量以及这些消息的延迟。对于这种情况,HTTP流和WebSocket之间没有根本性的区别-两者都是通过打开的套接字写入消息,几乎没有标题或开销。
如果消息的频率较低,则长轮询可以提供良好的延迟。但是,如果您有两条消息(从服务器到客户端)接连不断,则第二条消息将在第一条消息接收后进行新请求之前不会到达客户端。
我认为有人触及了HTTP KeepAlive。这显然可以改善长轮询-您仍然需要往返和标题的开销,但不总是需要套接字创建。
在客户端与服务器之间有更多的信息交互时,WebSocket应该比HTTP流式传输更为出色。将这些情景和实际世界联系起来会产生稍微更加任意的设置,与简单易懂的“向许多客户端发送大量消息”的场景相比,每个人都能理解。例如,在交易应用程序中,创建包含执行交易的用户(即客户端到服务器消息)的情境很容易,但结果比基本的服务器到客户端情境要少一些意义。交易者并不试图每秒进行100次交易,因此最终结果可能是“1万个用户每秒接收100条消息,同时每隔5分钟发送一次客户端消息”。对于客户端到服务器消息,更有趣的部分是延迟,因为所需的消息数量通常与服务器到客户端消息相比微不足道。
另外,有人提到了64k个客户端的问题。您不需要做任何聪明的事情来支持超过64k个套接字/sockets的服务器,除了配置文件描述符等数字。如果您试图从单个客户机上建立64k个连接,则完全不同,因为它们需要一个端口号 - 在服务器端这是可以的,那是监听端,您可以轻松处理超过64k个套接字/sockets。
有关 WebSockets 与 HTTP 的扩展性比较,请参见 this answer。
注意事项:
WebSocket 连接是长期存在的,不像 HTTP 连接是短期存在的。这显著降低了开销(无需为每个请求/响应创建和管理套接字),但这意味着要将服务器扩展到64k个独立同时客户端主机以上,您需要使用像在同一服务器上使用多个IP地址这样的技巧。
由于存在与Web中介的安全问题,浏览器到服务器的WebSocket消息具有所有有效载荷数据异或掩码。这会使服务器产生一些CPU利用率来解码消息。但是,在大多数 CPU 架构中,异或是最有效的操作之一,并且通常可提供硬件协助。从服务器到浏览器的消息没有掩码,由于许多WebSockets的用途不需要从浏览器发送大量数据到服务器,因此这不是一个大问题。
multipart/x-mixed-replace
内容类型的浏览器(除Firefox之外的所有浏览器),这意味着XHR.responseText
会不断增加,最终必须中断并重新启动流连接,否则浏览器最终会耗尽内存。 - leggetter很难对此进行比较,因为我们不知道(平均)有效载荷大小有多大。就底层实现而言,HTTP流和WebSockets几乎是相同的-除了初始握手外,当然使用HTTP时会更复杂。
如果您自己使用C编写WebSocket服务器(如Caplin),您可能不需要太多困难就可以达到这些数字。大多数WebSocket实现都是通过现有的服务器包(如Jetty)完成的,因此比较并不公平。
一些基准测试:
http://webtide.intalio.com/2011/09/cometd-2-4-0-websocket-benchmarks/
http://webtide.intalio.com/2011/08/prelim-cometd-websocket-benchmarks/
但是,如果您查看C事件库基准测试,例如libev和libevent,则数字看起来显着更佳:
http://libev.schmorp.de/bench.html
responseText
缓冲区增长,连接最终需要断开并重新连接。 - leggetter[字节数]\r\n[消息]\r\n
。你可以用多种方式来评估流。最简单的方法是检查 XHR 状态标志,并在获取新信息时解释它。然而,在 IE 中这种方法不起作用(存在几种混乱的 iframe 解决方法)。此外,我从未遇到任何浏览器因 responseText
太大而关闭连接。限制可能设置为几 MB。 - David Titarenco