HTTP与Websockets在开销方面的比较

8
我正在构建一个文件同步程序(类似于Dropbox),使用node.js在两端进行。我需要有潜在的成千上万的客户端同时请求数据。
这是我的当前系统:
- 服务器通过websocket向客户端推送通知(文件已更新) - 客户端排队下载并在空闲时进行HTTP请求
我将以压缩后的50 MB为一块的方式提供数据,因此HTTP请求开销(标头)可以忽略不计。
如果我要同时使用websocket进行请求和推送通知,会有以下问题:
- 整体速度是否明显提高?(减少延迟、身份验证等) - 服务器是否需要额外的开销来保持连接? - 推送二进制数据是否存在问题?
我认为我需要将通知发送到专用的websocket上,因为我不希望它们在下载正在进行时被排队(开销很大)。
注意:这些websocket将长期开放,只要客户端的系统开启即可。
编辑:我将在不同端口的不同http服务器上使用websocket,以将它们移动到不同的CPU核心。我可能会同时打开数千个(甚至数十万个)并发websocket...

“在两端使用node.js” - 所以客户端和服务器都需要安装node.js? 客户端不会是浏览器,例如? - yojimbo87
是的,没有浏览器。我将完全控制请求和响应。它将是一个在后台运行的桌面应用程序。简单的HTTP服务器、简单的HTTP客户端。 - beatgammit
2个回答

5

如果你打算同时在客户端和服务器端使用node.js,那么你应该使用原生的net模块和纯套接字,而不是WebSockets。纯套接字在数据传输方面更加优化,尤其是二进制数据。据我所知,浏览器的WebSockets甚至还不支持二进制传输。


1
我需要调查一下。在高负载下,有没有比较两个等效服务器的统计数据或基准测试? - beatgammit
我不知道有没有关于纯套接字和WebSockets的基准比较,但最近有一个类似的问题在这个主题上(https://dev59.com/iFXTa4cB1Zd3GeqP48nB)。 - yojimbo87
是的,有一些非常好的库,比如socket.io-node。如果没有人发布任何基准测试或比你的回答更完整的内容,我可能会将你的标记为正确答案。 - beatgammit
1
你说得没错,WebSocket 不支持二进制传输。我想我需要的是一个普通的 TCP 套接字。非常感谢您的帮助!! - beatgammit
4
为了让未来的观众更加清楚,Websocket确实支持二进制传输,但是Javascript没有二进制类型,这使得通过Websocket将二进制数据传输到浏览器变得不可能,但可以使用不同的客户端与Websocket一起传输数据。详情请参见:http://dev.w3.org/html5/websockets/ - Umur Kontacı

3

我在寻找其他信息时发现了这篇文章,它很好地解释了WebSocket:

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(我倾向于使用单个WebSocket)。

我真的希望这对某人有用。我会暂时保留这篇文章。本周晚些时候我将参加JS会议,如果我学到更多内容,我会添加到此帖子中。

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


嗨tjameson,关于文件传输项目的Web套接字实现,事情进行得如何? 我正准备在服务器端和客户端两边用Python开始一个类似的项目的实现。 从实际角度来说,使用Web套接字是一个好的做法还是只用它来进行消息传递,并通过HTTP完成文件传输部分呢?请根据您的经验告诉我您的想法。谢谢。 - securecurve
由于您正在使用Python,我只能假设您想要一些易于使用且足够快速的东西,而HTTP就是这样的选择。它提供了良好的结构并得到了广泛支持。对于一个Arduino项目,其中数据相当小,我实现了WebSocket协议而没有使用HTTP握手。它非常简单(一个字节头,1-8个字节的消息长度),而HTTP在Arduino上很难处理。如果您需要原始速度,请考虑使用WebSocket协议,否则请继续使用HTTP直到遇到问题。 - beatgammit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接