HTTP 与 Websockets 的开销对比
我正在两端使用 node.js 构建一个文件同步程序(与 Dropbox 不同)。我需要有潜在的数千个客户同时请求数据。
这是我当前的系统:
- 服务器通过 websocket 向客户端推送通知(文件已更新)
- 客户端对下载进行排队并在空闲时发出 HTTP 请求
我将以压缩块的形式提供数据,例如每个 50 MB,因此 HTTP 请求开销(标头)可以忽略不计。
如果我使用 websockets 来请求和推送通知,是否会出现:
- 整体速度显着提高? (减少延迟、身份验证等)
- 服务器上保持连接开放的额外开销?
- 推送二进制数据有问题吗?
我认为我需要通过专用的 websocket 发送通知,因为我不希望它们在下载时在服务器上排队(大量开销)。
注意:只要客户端的系统处于打开状态,这些 Websocket 将长期开放。
编辑:我将在不同端口上的不同 http 服务器上使用 Websockets,以便将它们移动到不同的位置CPU 核心。我可能会打开数千个(如果不是数十万个)并发 Websocket...
I am building a file synchronization program (not unlike Dropbox) using node.js on both ends. I need to have potentially thousands of clients requesting data at the same time.
Here is my current system:
- Server pushes notifications to client over a websocket (file has been updated)
- Client queues downloads and makes an HTTP request when idle
I will be serving data in compressed chunks of, say, 50 MB each, so the HTTP request overhead (headers) is negligible.
If I were to use websockets for requests and push notifications, would there be:
- Noticeable overall speed improvements? (reduced latency, authentication, etc.)
- Additional overhead on the server to keep connections open?
- Issues with pushing binary data?
I think I need to have notifications sent over a dedicated websocket because I don't want them to be queued on the server while a download is taking place (lots of overhead).
Note: These websockets will be open long-term, as long as the client's system is on.
EDIT: I will be using the websockets on a different http server on different ports in order to move them to different CPU cores. I could potentially have thousands (if not hundreds of thousands) of concurrent websockets open...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您打算在客户端和服务器上使用node.js,那么您应该使用本机 net 模块带有纯套接字而不是 WebSocket。纯套接字对于数据传输(尤其是二进制数据)进行了更好的优化。据我所知,浏览器 WebSocket 甚至还不支持二进制传输。
If you intend to use node.js for both client and server then you should use native net module with pure sockets rather than WebSockets. Pure sockets are much better optimized for data transfer, especially binary. As far as I know browser WebSockets do not even support binary transfer yet.
我正在寻找其他东西,我发现这篇文章很好地解释了 websockets:
http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor -example-with-node-js-and-websocket
以下是本文中一些非常有趣的部分:
和:
对于我的用例(没有浏览器),这似乎是最佳解决方案!现在我只需要决定每个客户端是否需要一个 Websocket 还是多个 Websocket(目前我倾向于使用一个 Websocket)。
我真的希望这对某人有用。我暂时将其保留。我将在本周晚些时候参加 JS 会议,如果我学到更多信息,我将添加到这篇文章中。
对于那些关心浏览器支持的人,请参阅此。看起来 WebKit 是唯一支持它的可靠引擎(Chrome 和 Safari)。
I was searching around for something else and I found this post that explains websockets pretty well:
http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket
Here are some pretty interesting parts from the article:
And:
For my use case (no browser), this seems like the optimal solution! Now I just need to decide whether I want to have a single websocket or multiple websockets per client (I'm leaning towards a single one at this point).
I really hope this is useful to someone. I'll leave this open for the time being. I'll be attending a JS conference later this week, and if I learn anything more I'll add to this post.
For those of you who care about browser support, see this. It looks like WebKit is the only reliable engine that supports it (Chrome and Safari).