Ajax与Socket.io的区别

14

我正在开发一个 Web 应用程序,想知道哪种方法适合我的项目。

基本上,我想向用户显示一些通知,这些通知来自对其他服务器的请求。我的 Node.js 应用程序获取所有信息,然后将其传播给用户,并将副本保存到 MongoDB 中。

这个想法相当简单,但在阅读了有关方法的信息后,我找到了以下两种技术:

  1. Ajax:客户端会一直检查服务器上是否有新内容。这可以通过使用 jQuery AJAX GET 请求访问我的服务器 API(每 30/60 秒)来完成。

  2. Socket.io:客户端连接一次,然后维护永久 TCP 连接(实时性更高)。


现在我已经解释了情况,我有以下问题:

  • Ajax 会不会太多请求?如果我们将应用扩展到 100 用户并且每分钟要对服务器进行一次检查,那么将会产生 100 个查询。用 Socket 是否更"便宜" 一些?

  • Socket.io 对移动设备会有问题吗?带宽和性能。服务器的响应始终是 JSON 格式的信息。

  • 我读到说现在可能会使用 now.js,但似乎该项目不再受支持,所以不确定使用它是否是个好主意。

  • 这两种方法的缓存如何?我考虑为每个用户创建一个缓存文件,并通过 Node.js 在服务器端更新。我想这可以与 Ajax 很好地配合使用,但 Socket.io 呢?

  • Socket.io 是否完全不兼容许多浏览器?我的应用程序更专注于移动设备,我认为这可能会让我考虑选择 Ajax。

  • 有什么替代方案推荐吗?

希望这能澄清我的思路并帮助其他处于同样境况的人 :) 谢谢


1
在我看来,由于您的应用程序不需要“真正”的实时性,因此通过Ajax调用进行长轮询是可以的。WebSocket更适合于实时性至关重要的场景,例如在线协作。 - Mox
我的个人决策过程是:如果您的应用程序需要每分钟处理100个请求,请使用ajax。如果它需要每秒钟处理100个请求,请使用Websockets。每当您发现自己需要每秒钟检查每个客户端一次时,尽可能使用Websockets。 - slebetman
жҜҸ30з§’дҪҝз”Ёajaxе’ҢsetIntervalжҲ–setTimeoutгҖӮжҳ“дәҺзҗҶ解并дҝқжҢҒжңҚеҠЎеҷЁж— зҠ¶жҖҒгҖӮ - AJcodez
1个回答

25

这里讨论了WebSocket和Ajax之间的一些通用权衡:

websocket vs rest API for real time data?

这里讨论了移动设备的一些权衡问题:

Cordova: Sockets, PushNotifications, or repeatedly polling server?

简而言之,如果您的数据主要由服务器驱动,然后需要发送到客户端,并且您希望客户端看到新数据时具有相当良好的延迟,则这是WebSocket擅长解决的问题。在这种情况下,WebSocket最有效,因为客户端不需要经常轮询,服务器也不需要处理大量客户端的定期轮询请求。相反,每个客户端只需设置一个持久的WebSocket通信通道,服务器就可以在任何时候按需向其发送数据。

使用ajax会不会导致太多请求?假设我想每分钟向服务器检查一次,如果我们将应用程序扩展到100个用户,那么它将给我100个每分钟的查询。使用套接字是否更“便宜”?

当套接字未活动时,套接字需要非常少的资源,因此持久的WebSocket比大量客户端无休止地轮询更有效率。这就是为什么发明WebSocket的原因,因为它们在解决这个特定问题方面更好。

socket.io对移动设备是否有问题?带宽和性能如何?服务器的响应始终以JSON格式返回信息。

socket.io对带宽或性能没有问题。在后台尝试在移动设备中使用WebSocket存在一些移动设备问题,因为移动设备也正在进行主动电源管理,但轮询客户端也存在类似的问题。

两种方法的缓存如何?我考虑为每个用户创建一个缓存文件,并且该文件将由服务器端的node.js更新。我想这可以与ajax很好地配合使用,但是socket.io呢?

不清楚您在询问什么关于缓存?在WebSocket实现中,服务器获取数据,然后将其发送给每个用户。通常不需要服务器端缓存。在客户端Ajax轮询实现中,服务器必须将数据存储在某个地方并“等待”每个客户端请求数据。WebSocket和Ajax均没有“内置”缓存机制。

socket.io与许多浏览器完全不兼容,这是真的吗?我的应用程序将更加专注于移动设备,我认为这可能会让我考虑选择ajax。

socket.io适用于所有支持webSockets的浏览器,除了IE9及更早版本。如果使用socket.io库,则会自动回退到长轮询(long polling),如果webSockets不存在。无论是进行普通轮询还是使用webSocket,您的移动设备问题可能都很相似,因为移动设备希望管理长时间运行的东西,但您不希望停止轮询。我认为这不是避免使用webSockets/socket.io的理由。当socket.io失去连接时,它具有一些非常好的自动重新连接逻辑,这非常有用。

在移动世界中,我认为您会发现,如果不使用某种可以插入设备本地“推送”系统的本地应用程序组件,就不能可靠地在后台进行实时通知,因为这是唯一既节省电池又完全兼容电源管理的系统。一旦网页不再是前台任务或设备处于空闲状态,它将被电源管理。


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