Socket.io 是聊天模块的理想选择吗
Posted
技术标签:
【中文标题】Socket.io 是聊天模块的理想选择吗【英文标题】:Is Socket.io Ideal for chat module 【发布时间】:2017-08-30 13:05:01 【问题描述】:我正在开发基于Angularjs
和Node.js
的应用程序。这是一个基于组织的应用程序。在这个应用程序中,我必须实现聊天功能。众所周知,Socket.io
是即时通讯应用程序及其可靠性的最佳解决方案。但除此之外,我对 Socket.io 几乎没有任何疑问。据我了解,当我们使用套接字编程(在我的情况下为 Socket.io)时,它为每个连接保留一个端口。如果组织的规模太大怎么办?它会起作用吗?在服务器端,我使用Express js
。 Socket.io
会在服务器上产生额外的负载吗?
我应该选择Socket.io
还是HTTP
?
谢谢。
【问题讨论】:
您认为单台服务器需要支持多大的规模(同时连接的用户)?而且,你有什么理由使用集群吗?而且,在任何给定的时间内,有多少客户会同时发送或接收聊天? @_jfriend00,这取决于组织的规模。这可能会有所不同。是的,你是对的,如果组织规模很大,我不会使用单个服务器或小型服务器。 你的问题没有意义。当然,这项技术会奏效。它会以您想要的规模工作吗?这完全取决于您想要的规模、您愿意部署的硬件以及用户将使用的负载模式类型。由于您不愿意提供任何这些要求的答案,那么您的问题确实无法回答。是的,该技术可以在一定规模、一定负载和一定硬件部署下发挥作用。 如果您要求将其与轮询 HTTP 客户端进行比较,那么轮询是对资源和可扩展性的巨大浪费,因为大多数时候,您的服务器所做的只是响应轮询请求它没有数据。这就是 webSocket/socket.io 的重点——您可以直接将数据推送到客户端,而无需客户端轮询。不活动的套接字不消耗服务器 CPU 和少量内存。服务器可以配置为同时处理数十万个套接字,并且可以集群化。 @_ jfriend00 我最初的疑问是:HTTP
的负载会更少还是Socket.io
会更少?我需要在哪些方面进行繁重的配置?
【参考方案1】:
对于初学者来说,使用 socket.io 聊天非常容易理解和集成。但是,带宽量在很大程度上取决于您要从服务器发送的数据量,以及客户端将发送的数据量。带宽使用情况还取决于您使用的 Socket.IO 传输方式以及应用程序的心跳间隔。
应用程序的性能影响还因您运行的应用程序类型以及您的机器和/或网络的性能能力而异。但是,无论您的计算机功能如何,5000 多个客户端都会对性能产生相当大的影响,除非您跨多个内核扩展应用程序。
您可以参考此链接了解更多详情。 Link
【讨论】:
【参考方案2】:HTTP 轮询任何类型的交互时间都是非常低效的。您将有数以万计的客户反复询问您的服务器,“您有什么新东西要给我吗?”并且服务器会定期响应“不,还没有”。
webSockets(socket.io 用作传输)的发明正是因为它们比 HTTP 轮询更有效地用于两种方式的交互式通信。
现代服务器可以配置为同时处理数十万个 webSocket 连接。在您的应用程序的实际工作中,您的一台服务器实际上可以处理多少个服务器取决于许多因素,您在问题中都没有透露这些因素。但是,对于双向聊天来说,选择 webSocket/socket.io 并不是一个糟糕的架构选择——发明这种应用程序的目的是因为在这种事情上它通常比 HTTP 轮询更好。
请参阅这些参考资料:
What are the pitfalls of using Websockets in place of RESTful HTTP?
Ajax vs Socket.io
Can this technology stack scale?
Do html WebSockets maintain an open connection for each client? Does this scale?
600k concurrent websocket connections on AWS using Node.js
Node.js w/1M concurrent connections!
HTML5 WebSocket: A Quantum Leap in Scalability for the Web
【讨论】:
添加了参考文章。【参考方案3】:使用 Socket.io。今天,它与聊天模块等高度交互的应用程序非常相关。使用 Web 套接字,只要相关用户正在向 Web 服务器注册服务,就没有协商协议并且连接保持打开状态。负载明显小于 http/https 协议。
【讨论】:
我明白你的意思,现在feathers JS也是一个非常有名的实时应用程序框架,它在引擎盖下使用了Socket.io。以上是关于Socket.io 是聊天模块的理想选择吗的主要内容,如果未能解决你的问题,请参考以下文章
在真实的服务器中运行socket.io服务器,而不是localhost?
节点 js 错误:找不到模块 './lib/socket.io'