Ajax 与 Socket.io

Posted

技术标签:

【中文标题】Ajax 与 Socket.io【英文标题】:Ajax vs Socket.io 【发布时间】:2015-07-30 22:14:20 【问题描述】:

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

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

这个想法很简单,但是阅读了我发现这两种技术的方法:

    Ajax:客户端会一直检查服务器上是否有新内容。这将通过使用 jquery ajax get 到我的服务器 API 来完成(每 30/60 秒)。

    Socket.io : 客户端连接一次,然后保持永久 TCP 连接(更实时)。


现在我已经说明了情况,我有以下问题:

我不会有太多的 ajax 请求吗?想象一下,我想每分钟检查一次服务器,如果我们将应用程序扩展到 100 个用户,它每分钟会给我 100 个查询。拥有一个套接字会在系统资源上“更便宜”吗?

socket.io 是否会成为移动设备的问题?带宽和性能。服务器的响应总是 JSON 格式的信息。

我读到 now.js 可以用于此,但似乎不再支持该项目,所以不确定使用它是否是个好主意。

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

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

任何替代建议?

我希望这可以让我和其他处于同样情况的人清醒:) 谢谢

【问题讨论】:

在我看来,由于您的应用程序不需要“真正的”实时,因此通过 ajax 调用进行长时间轮询就可以了。 Websocket 更适合实时性至关重要的地方。例如在线协作。 我个人的决策过程是:如果您的应用需要每分钟处理 100 个请求,请使用 ajax。如果它需要每秒处理 100 个请求,请使用 websockets。每当您发现自己需要每秒检查一次每个客户端时,如果可能,请使用 websockets 每隔 30 秒,使用 ajax 和 setIntervalsetTimeout。易于推理并使您的服务器保持无状态。 【参考方案1】:

这里讨论了 webSocket 和 Ajax 之间的许多通用权衡:

websocket vs rest API for real time data?

此处讨论了移动设备的一些权衡问题:

Cordova: Sockets, PushNotifications, or repeatedly polling server?

简而言之,如果您的数据主要是服务器驱动的,然后需要发送给客户端,并且您希望客户端看到新数据时有相当长的延迟,那么这正是 webSockets 擅长的问题. webSockets 在这种情况下工作得最好,因为客户端不需要频繁轮询,服务器不需要处理来自大量客户端的定期轮询请求。相反,每个客户端只需设置一个持久的 webSocket 通信通道,然后服务器可以随时根据需要向下发送数据。

我不会有太多的 ajax 请求吗?想象一下我想要一张支票 每分钟到服务器,如果我们将应用程序扩展到 100 个用户,它将 每分钟给我 100 个查询。它会在系统中“更便宜”吗 有套接字的资源?

套接字在不活动时需要很少的资源,所以是的,持久的 webSocket 比大量客户端无休止地轮询更有效。这就是为什么发明 webSockets 的原因,因为它们更擅长解决这个特定问题。

socket.io 对移动设备来说会是个问题吗?带宽和 表现。服务器的响应总是 JSON 格式的信息。

socket.io 不是带宽或性能问题。尝试在后台使用 webSockets 存在一些移动问题,因为移动设备也在尝试进行主动电源管理,尽管客户端轮询也存在类似问题。

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

不清楚您对缓存的要求是什么?在 webSocket 实现中,服务器获取数据,然后将其发送给每个用户。通常不需要服务器端缓存。在客户端 Ajax 轮询实现中,服务器必须将数据存储在某处并“等待”每个客户端请求数据。 webSocket 或 Ajax 都没有“内置”缓存机制。

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

socket.io 与所有具有 webSockets 的浏览器完全兼容,除了 IE9 和更早版本之外,几乎所有的浏览器都在使用。如果您使用 socket.io 库,如果 webSockets 不存在,它将自动退回到长轮询。无论您是进行常规轮询还是 webSocket,您的移动问题都可能相似,因为移动设备想要对长时间运行的事物进行电源管理,但您不想停止轮询。我不认为这是避免使用 webSockets/socket.io 的理由。 socket.io 在失去连接时有一些非常好的自动重新连接逻辑,这非常有用。

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

【讨论】:

以上是关于Ajax 与 Socket.io的主要内容,如果未能解决你的问题,请参考以下文章

ajax背景ajax对象ajax状态ajax与httpajax请求数据接口同步与异步ajax请求XML数据封装ajax函数artTemplate简介同源策略和跨域请求JSONP

django与Ajax

AJAX 和 jQuery 与 MVC

Ajax-原生Ajax详解-同步与异步底层

AJAX 状态值与状态码详解

AJAX与PHP