一尘不染

Cordova:套接字,PushNotifications还是反复轮询服务器?

node.js

我有一个Cordova / PhoneGap应用程序。

当应用程序在前台时,我想进行一些实时更新。

什么是最不消耗资源的方式来完成此任务?我应该使用socket.io,pushnotification插件还是仅每隔几秒钟发出一次API请求?设备和服务器上最少的负担是什么?


阅读 235

收藏
2020-07-07

共1个答案

一尘不染

对于移动设备,您需要在电池使用量,网络使用量和更新及时性之间进行权衡。

内置在移动操作系统中的推送通知服务旨在尽力为您提供所有这些权衡,并且它在全球范围内运行,而不是每个应用程序运行(通常效率更高),尽管它使您对实现细节的控制较少。

在比较socket.io与轮询API时,socket.io(更具体地说是webSockets)被设计为从服务器获取异步通知的更有效方法。

在socket.io中,创建到服务器的套接字连接。在应用程序运行期间(在前台),该连接保持打开状态,并且服务器可以随时向您发送数据,并且在发送数据后您会立即收到它。由于连接可能会丢失,并且不一定会立即通知端点,因此socket.io使用客户端和服务器之间定期发送的小型心跳数据包。如果心跳数据包停止响应,则socket.io假定连接已终止,并将关闭原始套接字并尝试创建新连接。它会透明,自动为您完成所有这些工作。但是,这种心跳对于移动设备有一些不良后果。发送的数据很小,因此这实际上不是带宽使用的问题,但是来自移动设备的每次传输都使用电池,如果长时间运行,这可能很重要。socket.io中的心跳间隔是可配置的。可以将其关闭(不建议),或者可以将时间间隔设置为更长的时间。

从服务器端的角度来看,操作系统推送服务和socket.io都是非常高效的,因为服务器仅在有实际要发送给客户端的东西时才起作用,而不必在无事可做的情况下发出常规请求。

此处进行轮询的唯一可能优势是,如果所需的更新间隔较长(例如,每小时一次),或者通常不启用且仅偶尔使用。然后,您可以每小时或在需要时发送Ajax呼叫,而服务器除了应答偶尔的Ajax呼叫外,无需执行任何其他操作。如果所需的时间间隔较短,则可能要使用一种真正的推送机制(操作系统推送或socket.io)。

2020-07-07