为什么在WebSockets可用时使用AJAX?

Jac*_*ack 196 ajax performance websocket node.js

我已经使用WebSockets一段时间了,我选择使用Node服务器和WebSockets为大学的最后一年项目创建一个敏捷项目管理工具.我发现使用WebSockets提供的应用程序每秒可处理的请求数量增加了624%.

然而,自从启动项目以来,我已经阅读了安全漏洞,并且一些浏览器默认选择禁用WebSockets.

这引出了我的问题:

当WebSockets似乎在降低延迟和资源开销方面做得如此出色时,为什么要使用AJAX?AJAX比WebSockets做得更好吗?

kan*_*aka 204

WebSockets并不是要取代AJAX,也不是Comet/long-poll的替代品(尽管有很多情况下这是有意义的).

WebSockets的目的是在浏览器和服务器之间提供低延迟,双向,全双工和长时间运行的连接.WebSockets为浏览器应用程序开辟了新的应用程序域,这些应用程序使用HTTP和AJAX(交互式游戏,动态媒体流,桥接到现有网络协议等)实际上是不可能的.

但是,WebSockets和AJAX/Comet之间的目的肯定存在重叠.例如,当浏览器想要获得服务器事件(即推送)的通知时,Comet技术和WebSockets肯定都是可行的选择.如果您的应用程序需要低延迟推送事件,那么这将是支持WebSockets的一个因素.另一方面,如果您需要与现有框架和已部署的技术(OAuth,RESTful API,代理,负载平衡器)共存,那么这将是支持Comet技术的一个因素(目前).

如果您不需要WebSockets提供的特定优势,那么坚持使用AJAX和Comet等现有技术可能是一个更好的主意,因为这可以让您重复使用并与现有的大型工具,技术,安全机制生态系统集成,知识库(即stackoverflow上的人们比WebSockets更了解HTTP/Ajax/Comet)等.

另一方面,如果您要创建一个在HTTP/Ajax/Comet的延迟和连接限制内无法正常工作的新应用程序,请考虑使用WebSockets.

此外,一些答案表明WebSockets的缺点之一是有限/混合服务器和浏览器支持.让我稍稍分散一下.虽然iOS(iPhone,iPad)仍然支持旧协议(Hixie),但大多数WebSockets服务器都支持Hixie和HyBi/IETF 6455版本.大多数其他平台(如果它们还没有内置支持)可以通过web-socket-js(基于Flash的polyfill)获得WebSockets支持.这涵盖了绝大多数网络用户.此外,如果您使用Node作为服务器后端,那么考虑使用Socket.IO,其中包括web-socket-js作为后备,如果即使不可用(或禁用),那么它将回退到使用任何Comet技术是可用于给定的浏览器.

更新:iOS 6现在支持当前的HyBi/IETF 6455标准.

  • 现在在2014年的时候,WebSockets实际上是一个标准(RFC 6455),只有Opera mini不支持它. (35认同)
  • 没错,Opera Mini不支持它,但更令人尴尬的是缺乏对Android浏览器的支持,这使得使用基于webview的应用程序(Cordova PhoneGap)有点复杂 (4认同)
  • @Pacerier一个完整的答案很长,但它基本上归结为你正在尝试重新实现浏览器已经做得很好的事情(缓存,安全性,并行性,错误处理等).关于性能,虽然从头开始原始的大文件传输速度会相似,但是浏览器已经花费了数年时间来精确调整Web内容的缓存(其中大部分适用于AJAX请求),所以在实践中,从AJAX切换到WebSockets不太可能提供太多有利于现有功能.但对于低延迟的双向通信来说,这是一个巨大的胜利. (3认同)
  • @kanaka,如果他们都同样擅长处理大文件,那为什么不简单地通过 websockets 发送所有内容呢?当一切都可以通过 WebSockets 发送时,为什么还要麻烦 ajax 页面/数据?(假设已经是 2020 年,所有浏览器都支持 WebSockets) (2认同)
  • 我很抱歉,但对我来说,它没有回答这个问题.它基本上只是说它们并不是要互相替换,并且WS不是完全支持的(现在是).它没有回答为什么你更喜欢AJAX而不是websocket?我们以Discord为例.Discord使用WS将消息和事件从服务器推送到客户端,同时使用从客户端到服务器的HTTP请求(发送消息,请求数据等).我已经来到这个问题,实际上得到一个答案为什么你会这样做.是否有某些技术原因可以将AJAX置于开放的WS连接之上? (2认同)

Mys*_*yst 58

快进到2017年12月,Websockets(实际上)支持每个浏览器,它们的使用非常普遍.

但是,这并不意味着Websockets设法取代AJAX,至少不完全,尤其是当HTTP/2适应正在增加时.

简而言之,即使使用Websockets,AJAX仍然适用于大多数REST应用程序.但上帝在细节中,所以...:

用于民意调查的AJAX?

使用AJAX进行轮询(或长轮询)正在消失(它应该是),但它仍然在使用中有两个很好的理由(主要针对较小的Web应用程序):

  1. 对于许多开发人员来说,AJAX更容易编码,特别是在编码和设计后端时.

  2. 使用HTTP/2,消除了与AJAX(建立新连接)相关的最高成本,允许AJAX调用非常高效,特别是对于发布和上传数据.

但是,Websocket推送远远优于AJAX(无需重新验证或重新发送标头,不需要"无数据"往返等).这已被讨论了很多次.

AJAX for REST?

更好地使用AJAX是REST API调用.此用法简化了代码库并防止Websocket连接阻塞(特别是在中型数据上传中).

有许多令人信服的理由喜欢使用AJAX进行REST API调用和数据上传:

  1. AJAX API实际上是为REST API调用而设计的,非常适合.

  2. 使用AJAX的REST调用和上传在客户端和后端都非常容易编码.

  3. 随着数据有效负载的增加,Websocket连接可能会被阻止,除非对消息碎片/多路复用逻辑进行编码.

    如果在单个Websocket send调用中执行上载,它可能会阻止Websocket流,直到上载完成.这会降低性能,尤其是在较慢的客户端上.

常见的设计使用通过Websockets传输的小型bidi消息,而REST和数据上传(客户端到服务器)利用AJAX的易用性来防止Websocket阻塞.

但是,在大型项目中,Websockets提供的灵活性以及代码复杂性和资源管理之间的平衡将有利于Websockets.

例如,基于Websocket的上传可以提供在连接被删除和重新建立后恢复大型上传的能力(还记得你要上传的5GB电影吗?).

通过对上传碎片逻辑进行编码,可以轻松恢复中断的上传(困难的部分就是对事物进行编码).

HTTP/2推送怎么样?

我应该补充一点,HTTP/2推送功能不会(也可能不会)替换Websockets.

这在前面已经讨论过了,但足以提到单个HTTP/2连接服务于整个浏览器(所有选项卡/窗口),因此HTTP/2推送的数据不知道它属于哪个选项卡/窗口,消除它取代Websocket将数据直接推送到特定浏览器选项卡/窗口的能力.

虽然Websockets非常适合小型双向数据通信,但AJAX仍然具有许多优势 - 特别是在考虑更大的有效载荷(上传等)时.

和安全?

嗯,一般来说,为程序员提供的信任和控制越多,工具就越强大......而且越多的安全问题就越多.

AJAX本质上具有优势,因为它的安全性内置于浏览器的代码中(有时候会有问题,但它仍然存在).

另一方面,AJAX调用更容易受到"中间人"攻击,而Websockets安全问题通常是引入安全漏洞的应用程序代码中的错误(通常后端验证逻辑是您可以找到它们的地方).

就个人而言,我并不觉得这有什么大不同,如果有什么我认为Websockets稍微好一些,特别是当你知道你在做什么的时候.

我的拙见

恕我直言,除了REST API调用,我还会使用Websockets.大数据上传我会在可能的情况下分段并通过Websockets发送.

民意调查,恕我直言,应该是非法的,网络流量的成本是可怕的,Websocket推送很容易管理,即使是新开发人员.

  • 小的语法错误'如果我有什么事......'想 (2认同)
  • @spottedmahn - 谢谢!我想这就是我使用我的代码编辑器来草拟文本的情况 (2认同)

Ale*_*one 17

除了旧版浏览器的问题(包括IE9,因为从IE10开始支持WebSockets),网络中介还没有支持WebSockets的问题,包括透明代理,反向代理和负载均衡器.有些移动运营商完全阻止了WebSocket流量(即在HTTP UPGRADE命令之后).

随着时间的推移,WebSockets将得到越来越多的支持,但与此同时,您应始终使用基于HTTP的回退方法将数据发送到浏览器.


Tim*_*ith 16

我读到的关于websockets和安全性的大多数抱怨来自Web浏览器安全和防火墙安全工具的安全供应商.问题是他们不知道如何对websockets流量进行安全性分析,因为一旦完成从HTTP到websocket二进制协议的升级,数据包内容及其含义就是特定于应用程序(基于您编程的任何内容).这显然是这些公司的后勤噩梦,这些公司的生计基于对所有互联网流量进行分析和分类.:)


jli*_*jli 10

WebSockets在旧的Web浏览器中不起作用,并且支持它的那些通常具有不同的实现.这几乎是他们不是一直用来代替AJAX的唯一原因.

  • 更好的理由是AJAX请求是普通的HTTP请求,这意味着它可以检索HTTP资源; WebSockets无法做到这一点. (8认同)
  • @DanD.,HTTP和WebSocket是两个不同的协议,当然我们不能使用WebSocket协议请求HTTP资源,原因与我们无法使用HTTP协议请求WebSocket资源相同!**这并不意味着客户端无法请求通过Websocket协议发送的html和/或图像文件.** (8认同)

归档时间:

查看次数:

80927 次

最近记录:

7 年,4 月 前