【问题标题】:Using WebSockets... Efficiently?使用 WebSockets... 有效吗?
【发布时间】:2011-06-01 19:29:19
【问题描述】:

我已经阅读了几乎所有可以在 WebSockets 上找到的指南和教程,但没有一篇介绍如何有效地使用它们。

有没有人有任何关于如何做到这一点的指南?我担心单个连接可能占用的带宽量,尤其是当应用程序打开了数百个连接时。

【问题讨论】:

  • 可能,但一点点优化也无妨,尤其是在网络延迟是一个重要因素的应用程序中。
  • 所以你想要 websockets 的 QoS ......或者究竟是什么?它们的全球最大值?您是担心这里的客户端还是服务器?
  • @Alexander:效率取决于服务器的架构,例如穿线。作为应用程序开发人员,您只发送尽可能少的内容。
  • @Alexander 使用 Bison
  • @Alexander:您使用的 Node.js 非常高效。

标签: javascript networking websocket


【解决方案1】:

WebSocket 的效率取决于处理它们的网络服务器的实现和架构。与在每个 Ajax 请求中发送的所有不同的 HTTP header fieldsHTTP cookies 相比,WebSocket 是一个非常高效的协议,只有 2 字节 (!) 开销。

通常,一个高效的 websocket 网络服务器应该是事件驱动的(参见下面的示例)。相反,实现 Web 服务器的传统方式是为每个请求生成一个新线程。但是线程分配了很多内存,例如每个线程 256MB。因此,如果您的服务器上有 1GB 内存,您将无法同时处理很多请求。但是,如果您的服务器是事件驱动的,那么您的内存使用量将几乎保持不变,因为不会创建新线程。另见Technically why is processes in Erlang more efficient than OS threads?

您可以在 WebSocket 中发送任何数据。如果客户端是 Web 浏览器,或者可能是 typed arrays,则 JSON 是有效的。如果您的客户端是自定义应用程序,您可以使用Protocol Buffers。另见Google Wave Client-Server Protocol Whitepaper

您可以使用 Twisted (Python) 或 Netty (Java) 实现高效的 websocket 服务器。 Play Framework 是在 Netty 上实现的 Java 和 Scala 的高效 Web 框架。另一个有效的替代方案是 Yaws Web 服务器 (Erlang) 或 Node.js + Socket.io (JavaScript)。

作为应用程序开发人员,您发送的数据越少,效率越高(流量越少),服务器上的负载就越少。

【讨论】:

  • 线程内存取决于操作系统和技术。一般来说,一个 JVM 的线程在 64 位字节系统上是 1024k 内存,而不是 256 MB。线程是轻量级进程,而不是整个操作系统。
  • 您能否详细说明在什么情况下线程可能会用完 256MB?这是否与 WebSocket 技术特别有关?
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2021-10-09
相关资源
最近更新 更多