jQuery-Node.js:Ajax与Socket.IO的优缺点

我考虑过摆脱所有客户端Ajax调用(jQuery),而是使用永久套接字连接(Socket.IO)。

因此,我将在客户端和服务器端使用事件侦听器/发射器。

例如 用户在浏览器中触发单击事件,客户端发射器通过套接字连接将事件推送到服务器。 服务器端侦听器对传入事件做出反应,并将“完成”事件推回客户端。 客户端的侦听器通过淡入DIV元素对传入事件做出反应。

这完全有意义吗?优点缺点?

ezmilhouse asked 2020-07-12T11:08:00Z
3个解决方案
56 votes

此线程中有很多常见的错误信息,这些信息非常不准确。

TL / DR;WebSocket取代了HTTP的应用程序! 它是由Google在Microsoft和其他许多领先公司的帮助下设计的。 所有浏览器都支持。 没有缺点。

SocketIO建立在WebSocket协议(RFC 6455)之上。 它旨在完全替代AJAX。 它从来没有任何可伸缩性问题。 它的工作速度比AJAX快,但消耗的资源却少了一个数量级。

AJAX已有10年的历史了,它建立在单个JavaScript XMLHTTPRequest函数的基础上,该函数被添加来允许回调服务器而无需重新加载整个页面。

换句话说,AJAX是具有单个JavaScript函数的文档协议(HTTP)。

相反,WebSocket是一种应用程序协议,旨在完全替代HTTP。 升级HTTP连接(通过请求WebSocket协议)时,您启用了与服务器的双向全双工通信,并且从未涉及任何协议握手。 使用AJAX,您要么必须启用保持活动状态(与SocketIO相同,只有较旧的协议),要么在每次发出AJAX请求时强制使用新的HTTP握手,使服务器中断。

在Node之上运行的SocketIO服务器仅使用4 GB的ram和一个CPU就可以在keep-alive模式下处理100,000个并发连接,而此限制是由V8垃圾收集引擎而不是协议引起的。 即使在您最疯狂的梦想中,也永远不会使用AJAX实现这一目标。

为什么SocketIO如此之快,却消耗更少的资源

再次出现这种情况的主要原因是,WebSocket是为应用程序设计的,而AJAX是一种变通方法,可以在文档协议之上启用应用程序。

如果您深入研究HTTP协议,并使用MVC框架,您会看到一个AJAX请求实际上将仅向AJAX传输700-900字节的协议负载到URL(没有您自己的有效载荷)。 与之形成鲜明对比的是,WebSocket大约使用10个字节,即减少70倍的数据与服务器进行通信。

由于SocketIO保持开放连接,因此无需握手,并且服务器响应时间限于与服务器本身的往返或ping时间。

错误的信息是套接字连接是端口连接。 它不是。 套接字连接只是表中的一个条目。 消耗的资源很少,单个服务器可以提供1,000,000+个WebSocket连接。 AWS XXL服务器可以并且确实托管着1,000,000+的SocketIO连接。

AJAX连接将对整个HTTP标头进行gzip /压缩,解码标头,对标头进行编码,并启动HTTP服务器线程以再次处理请求,因为这是一个文档协议; 该服务器旨在一次性吐出文件。

相比之下,WebSocket只是将一个条目存储在用于连接的表中,大约40-80字节。 就是这样。 完全没有轮询发生。

WebSocket是按比例设计的。

至于SocketIO太乱了...根本不是这样。 AJAX杂乱无章,您需要承诺/响应。

使用SocketIO,您只需拥有发射器和接收器; 他们甚至不需要了解彼此。 无需承诺系统:

要请求用户列表,您只需向服务器发送一条消息...

socket.emit("giveMeTheUsers");

服务器就绪后,它将向您发送另一条消息。 多田你做完了 因此,要处理用户列表,您只需说出要查找的响应该怎么做...

socket.on("HereAreTheUsers", showUsers(data) );

而已。 烂摊子在哪里? 好吧,没有一个:)关注点分离吗? 为你做了。 锁定客户端,使他们知道必须等待吗? 他们不必等待:)您可以在任何时候获得新的用户列表...服务器甚至可以以这种方式播放任何UI命令...客户端可以彼此连接,甚至不需要将服务器与WebRTC一起使用。 。

SocketIO中的聊天系统? 10行代码。 实时视频会议? 80行代码是...卢克...加入我。 为工作使用正确的协议...如果要编写应用程序...请使用应用程序协议。

我认为这里的问题和困惑来自习惯于使用AJAX的人们,并认为他们需要客户端上的所有额外Promise协议和后端上的REST API……嗯,您不需要。 :)不再需要:)

是的,您没看错……当您决定切换到WebSocket时,就不再需要REST API。 REST实际上已经过时了。 如果编写桌面应用程序,是否通过REST与对话框通信? 否:)这真是愚蠢。

使用WebSocket的SocketIO可以为您做同样的事情...您可以开始将客户端视为应用程序的简单对话框。 您完全不再需要REST。

实际上,如果您尝试在使用WebSocket的同时使用REST,则与使用REST就像桌面对话框的通信协议一样愚蠢……根本没有意义。

你说蒂米是什么? 想要使用您的应用程序的其他应用程序呢? 您应该让他们访问REST? 蒂米(Timmy)... WebSocket已经使用了4年了...让他们使用WebSocket连接到您的应用,并让他们使用该协议来请求消息...它将消耗的资源减少50倍,速度更快,并且轻松10倍 发展...在创造未来时为什么要支持过去?

当然,有REST的用例,但它们都是用于较旧和过时的系统的……大多数人还不知道。

更新:

最近有很多人问我,他们如何才能在2018年(以及现在的2019年)开始使用WebSockets编写应用程序,所以障碍似乎真的很高,一旦他们使用Socket.IO,他们就不知道该怎么做。 转或学习什么。

幸运的是,最近3年对WebSockets非常友好...

现在有3个主要框架都支持REST和WebSocket,甚至支持IoT协议或其他最小/快速协议(如ZeroMQ),您不必为此担心。 您就可以立即获得支持。

注意:尽管Meteor迄今为止最受欢迎,但我将其省略,因为尽管它们是一个资金非常充裕的WebSocket框架,但是使用Meteor编码了几年的任何人都会告诉您,这是一个内部混乱, 噩梦规模化。 类似于WordPress的PHP,它在那里,很流行,但是制作得不是很好。 它不是经过深思熟虑的,很快就会死掉。 抱歉,Meteor的人,但请查看与Meteor相比的这3个其他项目,您将在同一天将Meteor扔掉:)

使用以下所有框架,您只需编写一次服务,即可获得REST和WebSocket支持。 更重要的是,只需一行配置代码即可在几乎所有后端数据库之间进行交换。

Feathers最易于使用,在前端和后端都可使用,并且支持大多数功能,Feathers是用于现有工具(如express)的轻量包装的集合。 使用feathers-vuex等出色的工具,您可以创建完全可模拟的不可变服务,支持REST,WebSocket和其他协议(使用Primus),并获得免费的完整CRUD操作,包括搜索和分页,而无需一行代码(仅 一些配置)。 对于生成的数据(例如json-schema-faker)也非常有效,因此您不仅可以完全模拟事物,还可以使用随机但有效的数据对其进行模拟。 您可以连接一个应用程序,以支持无需输入代码(只需配置)的预先输入搜索,创建,删除和编辑。 你们中有些人可能知道,正确的代码通过配置是自我修改代码的最大障碍。 Feathers做得对,并会在未来的应用程序设计中将您推向最前沿。

不幸的是,Moleculer在后端比Feathers好一个数量级。 尽管羽毛可以工作,并且可以扩展到无穷大,但羽毛甚至根本没有开始考虑生产集群,实时服务器控制台,容错,开箱即用的管道日志或API网关(在我构建时) Moleculer用Feathers开发出了生产API网关,而且效果更好)。 无论是在流行度还是新功能方面,Moleculer都是增长最快的WebSocket框架。

Moleculer的制胜法宝是您可以将Feathers或ActionHero前端与Moleculer后端配合使用,尽管您损失了一些发电机,但仍可以提高生产质量。

因此,我建议您在前端和后端学习羽毛,并在制作完第一个应用程序后,尝试将后端切换到Moleculer。 Moleculer较难上手,但这仅仅是因为它为您解决了所有缩放问题,并且此信息可能会使新用户感到困惑。

ActionHero在此处被列为可行的选择,但Feathers和Moleculer是更好的实现。 如果有关ActionHero的任何内容都无法满足您的需求,请不要使用它。 上面有两种更好的方法可以让您更快地获得更多收益。

注意:API网关是未来,上面的所有3种方法都支持它们,但是Moleculer确实为您提供了开箱即用的功能。 API网关使您可以与客户端互动,通过单个平台组件处理缓存,备忘录,客户端到客户端消息传递,黑名单,注册,容错和所有其他扩展问题。 将您的API网关与Kubernetes耦合将使您可以扩展到无穷大,而问题的数量最少。 这是可伸缩应用程序可用的最佳设计方法。

Nick Steele answered 2020-07-12T11:11:41Z
21 votes

Socket.IO使用客户端和服务器之间的持久连接,因此根据服务器端的资源,您将达到并发连接的最大限制,而相同的资源可以处理更多的Ajax异步请求。

Socket.IO主要用于客户端和服务器之间的实时双向连接,在某些应用程序中无需保持永久连接。 另一方面,Ajax异步连接应该通过HTTP连接设置阶段,并随每个请求发送标头数据和所有cookie。

Socket.IO被设计为单个进程服务器,并且可能会遇到可伸缩性问题,具体取决于您绑定到的服务器资源。

当您更好地缓存客户端请求的结果时,Socket.IO不太适合应用程序。

Socket.IO应用程序在SEO优化和搜索引擎索引编制方面面临困难。

Socket.IO不是标准的,并且不等同于W3C Web Socket API,如果浏览器支持,它将使用当前的Web Socket API,由人创建的socket.io用于解决实时应用程序中的跨浏览器兼容性,而且还很年轻,大约1年 旧。 与ajax / jquery相比,它的学习曲线,更少的开发人员和社区资源,长期的维护以及将来的需求减少或更好的选择对于开发人员团队是否基于socket.io编写代码可能很重要。

Reza Hashemi answered 2020-07-12T11:12:26Z
6 votes

以一种方式发送消息并调用回调可能会变得非常混乱。

$.get('/api', sendData, returnFunction);socket.emit('sendApi', sendData); socket.on('receiveApi', returnFunction);

这就是为什么dnode和nowjs建立在socket.io之上以使事物易于管理的原因。 仍由事件驱动,但不放弃回调。

generalhenry answered 2020-07-12T11:08:21Z
translate from https://stackoverflow.com:/questions/7193033/nodejs-ajax-vs-socket-io-pros-and-cons