Ajax 与 Socket.io

标签 ajax node.js websocket socket.io-1.0

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

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

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

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

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


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

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

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

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

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

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

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

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

最佳答案

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

websocket vs rest API for real time data?

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

Cordova: Sockets, PushNotifications, or repeatedly polling server?

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

Would I not have too many requests with ajax ? imagine I want a check every minute to the server, if we scale the app to 100 users, it will give me 100 queries per minute. Would it be "cheaper" in system resources to have a socket ?

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

Would the socket.io be a problem for mobile devices ? bandwith and performance. The response of the server is always info in JSON format.

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

How is the caching on both methods ? I was considering to create a cache file for each user and this would be updated by the node.js in the server side. I guess this could work really well with ajax but what about socket.io ?

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

Is it true that socket.io is not compatible at all with many browsers ? My app would be more focused to mobile devices and I think this could make me think about choosing ajax instead.

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

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

关于Ajax 与 Socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319618/

相关文章:

箭头函数内的 WebSocket 回调未按词法设置 'this'

javascript - 如何使用 Jquery 的 AJAX 提交复杂的表单?

javascript - 使用 ajax 和 php 执行 Linux shell 命令

javascript - 处理请求时使屏幕变黑

node.js - 要求未在 Angular 中定义

android - Android 上的 WebSockets 和 Android 上的 socket.io

c# - InternalClientWebSocket 实例无法用于通信,因为它已转换为 'Aborted' 状态

javascript - 通过ajax调用删除表中的tr

node.js - 为什么我的时间戳字段在将数据嵌入到 map 列表中后变成时间 map ?

node.js - Express 和 MEAN 堆栈中的路由