【问题标题】:Cordova: Sockets, PushNotifications, or repeatedly polling server?Cordova:套接字、推送通知或重复轮询服务器?
【发布时间】:2015-04-24 20:12:36
【问题描述】:

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

当应用程序在前台时,我希望有一些类似的实时更新。

完成此任务的资源消耗最少的方法是什么?我应该使用 socket.io、pushnotification 插件,还是每隔几秒发出一次 API 请求?对设备和服务器来说,什么是最省力的?

【问题讨论】:

  • 按照我的建议,如果你设法使用 socket.io 将是最好的,并且每隔几秒发出请求是其中最糟糕的方法
  • @A.B:我并不反对,但您如何得出套接字比推送通知更好的结论?
  • 我猜如果用户拒绝使用推送通知的权限,这是一个后备方案,在应用程序打开时仍允许实时更新?
  • 因为在科尔多瓦使用 JS 并且拥有 JS 背景,大多数人更喜欢使用它,因为他们已经使用过它,@sanfor 这就是我的观点,所以我没有添加作为答案,因为我不确定其他意见:)

标签: javascript node.js cordova


【解决方案1】:

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

内置于移动操作系统中的推送通知服务旨在为您提供所有这些权衡中的最佳选择,它在全球范围内而不是按应用程序运行(这通常更有效),尽管它使您对实施的控制较少详情。

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

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

操作系统推送服务和 socket.io 在服务器端都非常有效,因为服务器仅在有实际发送给客户端的内容时才工作,而不必在没有任何内容的情况下处理常规请求去做。

此处轮询的唯一可能优势是,如果您想要的更新间隔很长(例如,一个小时一次),或者它通常不开启并且只是偶尔使用。然后,您可以每小时或根据需要发送一个 Ajax 调用,而服务器除了应答偶尔的 Ajax 调用外无需执行任何操作。如果所需的时间间隔更短,那么您可能会想要使用其中一种真正的推送机制(操作系统推送或 socket.io)。

【讨论】:

  • 太棒了 @jfriend00 ,socket.io 会像 web 应用程序(使用 node.js)一样在 phonegap(localhost file:// 问题)中正常工作吗?设置时遇到问题
  • @A.B - 有关将 socket.io 与 PhoneGap 结合使用的一些信息:Socket.IO with Apache CordovaSocket.io + PhoneGap。看起来你可能需要做一些适当的 phonegap 配置才能工作。
  • @A.B - 你的问题得到解答了吗?
  • 感谢分享链接和这个问题,我已经阅读了它似乎很有用,但我还没有实际尝试过,如果我们可以实时移动应用程序而无需学习 pusher.com 的大量文档,那就太好了,火力基地等
【解决方案2】:

使用网络套接字。

基于轮询的方法引入了最低开销,即必须每 X 秒发出一次请求以检查是否有任何新消息,这给您带来了糟糕的权衡:请求率越低,您的应用程序的响应速度就越慢。 xhr long polling 通过将 http 请求保持打开 30-60 秒左右在一定程度上降低了此成本,允许服务器尽快发送响应,但这仍然会强制执行定期请求间隔。

websocket 是一个持久连接,这意味着每个客户端都有一个连接保持打开状态。这意味着内存使用,但我不会太担心。在持久连接之前,您将成为实际消息流量的瓶颈

这是一本非常好的读物,可以让您了解在 node.js 上使用 websockets 可以实现什么样的规模: http://www.jayway.com/2015/04/13/600k-concurrent-websocket-connections-on-aws-using-node-js/

有很多选择,我推荐的两个是 socket.io 和 faye。它们都很容易启动和运行。两者还将为您处理诸如定义消息通道、连接/断开连接协议之类的事情,并且它们具有选择客户端和服务器都支持的正确传输的额外优势。例如,Socket.io 1.0+(使用 engine.io)将从长轮询开始,如果两个端点都支持它,则升级到 websockets,这可以加快速度。 Faye 是一个不错的轻量级 pub/sub 系统,而 socket.io 则涉及更多,基于会话的产品。根据您的需要,其中一个可能是不错的选择。

如果最小化您的请求负载是您最关心的问题,那么直接使用 npm ws(这是 socket.io 和 faye 都依赖的)实现 websockets 也是一种选择,但这显然更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多