关于开销的 HTTP 与 Websockets

Posted

技术标签:

【中文标题】关于开销的 HTTP 与 Websockets【英文标题】:HTTP vs Websockets with respect to overhead 【发布时间】:2011-04-04 06:31:17 【问题描述】:

我正在两端使用 node.js 构建一个文件同步程序(与 Dropbox 不同)。我需要潜在的数千个客户端同时请求数据。

这是我目前的系统:

服务器通过 websocket 向客户端推送通知(文件已更新) 客户端将下载排队并在空闲时发出 HTTP 请求

我将以每个 50 MB 的压缩块的形式提供数据,因此 HTTP 请求开销(标头)可以忽略不计。

如果我使用 websockets 请求推送通知,会有:

显着的整体速度提升? (减少延迟、身份验证等) 在服务器上保持连接打开的额外开销? 推送二进制数据的问题?

我认为我需要通过专用的 websocket 发送通知,因为我不希望它们在下载时在服务器上排队(大量开销)。

注意:只要客户端系统处于开启状态,这些 websocket 就会长期打开。

编辑:我将在不同端口上的不同 http 服务器上使用 websocket,以便将它们移动到不同的 CPU 内核。我可能会打开数千个(如果不是数十万个)并发 websockets...

【问题讨论】:

"在两端使用 node.js" - 所以客户端和服务器都安装了 node.js?例如,客户端不会是浏览器? 是的,没有浏览器。我将完全控制请求和响应。这将是一个在后台运行的桌面应用程序。简单的 HTTP 服务器,简单的 HTTP 客户端。 【参考方案1】:

如果您打算将 node.js 用于客户端和服务器,那么您应该使用带有纯套接字而不是 WebSockets 的本机 net 模块。纯套接字对数据传输进行了更好的优化,尤其是二进制。据我所知,浏览器 WebSockets 甚至还不支持二进制传输。

【讨论】:

我得调查一下。是否有任何统计数据或基准比较高负载下的两个等效服务器? 我没有比较纯套接字与 WebSockets 的任何基准,但最近有一个类似的 question 关于这个主题。 是的,有一些很不错的库,比如socket.io-node。如果没有人发布任何基准或比您的答案更完整的内容,我可能会将您的答案标记为正确。 关于 websockets 不支持二进制传输的说法绝对正确。我认为我正在寻找一个常规的 TCP 套接字。非常感谢您的帮助! 为了让未来的观众更清楚,websocket 确实支持二进制传输,但是 javascript 没有二进制类型,这使得通过 websocket 将二进制数据传输到浏览器是不可能的,但是可以使用 websocket使用不同的客户端传输 websocket。见:dev.w3.org/html5/websockets【参考方案2】:

我在四处寻找其他东西,发现这篇文章很好地解释了 websockets:

http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket

以下是文章中一些非常有趣的部分:

与现有解决方案相比,Websocket 使您能够以显着减少的网络开销进行持续通信。

还有:

在与 WebSocket 建立连接期间,客户端和服务器每帧交换数据,每帧 2 字节,而连续轮询时,http 标头为 8 千字节。

对于我的用例(无浏览器),这似乎是最佳解决方案!现在我只需要决定是否要为每个客户端使用一个 websocket 或多个 websocket(我现在倾向于一个)。

我真的希望这对某人有用。我将暂时保持开放状态。本周晚些时候我将参加一个 JS 会议,如果我了解更多信息,我会添加到这篇文章中。

对于那些关心浏览器支持的人,请参阅this。看起来 WebKit 是唯一支持它的可靠引擎(Chrome 和 Safari)。

【讨论】:

嗨 tjameson,关于文件传输项目的 web-socket 实现,您的进展顺利吗?我即将在服务器端和客户端开始在 Python 中实现一个类似的项目。实际上,在 websockets 中执行它是一个好习惯,还是我应该只将它用于消息传递并在 HTTP 中完成文件传输部分?让我从你的经验中知道你的想法。谢谢。 由于您使用的是 Python,我只能假设您想要一些足够简单和快速的东西,HTTP 就是这样。它提供了一个很好的结构并且得到了很好的支持。对于数据非常少的 Arduino 项目,我在没有 HTTP 握手的情况下实现了 WebSocket 协议。它非常简单(一个字节的标头,1-8 个字节的消息长度)并且 HTTP 在 Arduino 上很难。如果您需要原始速度,请考虑这一点,否则请坚持使用 HTTP,直到遇到问题。

以上是关于关于开销的 HTTP 与 Websockets的主要内容,如果未能解决你的问题,请参考以下文章

Day764.RedisCluster规模导致的通信开销问题 -Redis 核心技术与实战

Day764.RedisCluster规模导致的通信开销问题 -Redis 核心技术与实战

LINQ 查询是不是有很多开销?

关于Java线程池详解

C ++映射插入和查找性能和存储开销

XCode 4 无法编译一个非常大的数组,以及关于 NSArray/NSString 开销的问题