Websockets和iOS Push通知的区别

12

拿Instagram这样的iOS应用为例,它基本上是一个实时应用程序,每当用户与您交互时更新其UI。例如,如果有人喜欢你的帖子并且你正在使用该应用程序,则UI会更新以触发多巴胺释放并通知您其中一篇帖子已经发生了一些事情。同样,在Instagram上有人给你发送直接消息时,当你使用该应用程序时,你会看到消息从顶部弹出,所有这些都是实时的。

就实现此类实时功能而言,显然天真的HTTPS轮询方法效率太低。因此留下了两种策略:

1.) APNS推送通知:

当用户喜欢帖子,发送直接消息,评论等时,向后端服务器发送HTTP POST请求,然后更新数据库并向接收者的设备发送静默的Apple推送通知。使用应用程序的接收者将接收到推送有效负载,并将发送HTTP GET请求到后端服务器来获取所需数据(即发送的直接消息的内容)。UI在准实时中更新。

2.) Websockets:

每当任何用户打开iOS应用程序时,通过websocket将用户连接到服务器。这意味着,当前使用该应用程序的所有用户都通过自己的websocket连接到服务器。当用户喜欢帖子、发送直接消息、评论等时,应用程序通过socket向服务器发送消息指示动作。在更新数据库之前,服务器会找到与收件人相关联的socket,并通过socket将消息转发给收件人。收到消息后,UI会实时更新。
哪种方法更具可扩展性并更适合生产环境?
3个回答

7
TL;DR:您会喜欢WebSocket + Combine框架,通过事件驱动使您的UI平稳更新。APNS在交付能力和资源/数据库成本方面有些不可靠,对我来说更像是一个信息中心。
WebSockets让您喜欢的原因:
- 降低数据库成本(例如查找要发送的设备) - 您知道用户何时未使用应用程序,从而减少传出数据成本 - 更低延迟和更快速度(websocket段落中更深入)
回答问题:WebSocket基于用户数量可扩展。 APNS在CI中无法进行服务器端测试,不跨平台,并且在资源消耗方面并不实际可行。
我对WebSockets有一种偏见。但是为了说明我更喜欢它的原因,请考虑Instagram示例所提供的效率。
对我而言,WebSockets ==事件驱动,APNS是简单的信息中心。
APNS:
您在APNS上注册并将设备保存在后端。很好,每次执行操作(例如某人喜欢您的帖子),都会查询您的后端,找到与OP相关联的设备,然后发出外部请求(如果您认为云计算成本是金钱)。每当有人喜欢您的帖子时,您都必须这样做(显然可以聚合,但是如果有WebSocket,为什么要麻烦呢?)。因此,数据库成本是要考虑的一个问题。此外,用户可能会将其通知静音。我没有Instagram,但是在效率方面,他们可以采用以下方法(如果不是通过套接字):根据收到的喜欢/心形通知更新其UI,而不是通过WebSocket连接。 从延迟、成本和被标记为垃圾邮件的可靠性来看,这很慢。但是,APNS的好处是不需要授权,不像WebSocket,但是...
WebSockets:
当我们接近WebSocket时,您仅需一次授权(至少对于移动应用程序)。通过删除诸如报头之类的内容,您正在消除传出数据成本(以$$和延迟表示)。您希望发送小块数据,而套接字只是发送文本/二进制数据(我喜欢使用JSON将它们创建为命令。其中一个显着的例子是GitHub)。当用户完成应用程序后,关闭连接,您不需要通过APNS再发送任何数据。您的服务器本身可以通过Redis PubSub之类的东西与单个WebSocket进行通信,以更新您的UI,当某人使用POST请求“点赞”帖子而无需发送任何推送通知时。对于点赞者(无需等待发送推送通知)或向后台任务卸载它的另一种方式(OP不需要等待),这是一个胜利。WebSockets ==事件驱动:
  • 频繁传输小数据块比使用APNS更好,因为后者可能传送缓慢,尤其是当您向苹果或用户发送大量通知时,会被标记为垃圾邮件。不过需要说明的是,这只是我个人的看法和根据您的用例所做的推测。
  • 使用WebSocket可以减少不必要的数据库成本。
  • 缺点是需要保持连接。

个人而言,我最近在聊天应用中使用了结合框架的WebSocket技术,但它也可以在很多不同的情况下使用,例如更新Facebook动态/评论区、通过WebSocket实现实时通知而非APNS、甚至发布内容等。


1
APNS不能保证一定会被传递,特别是当你有大量通知时 - 我不记得在哪里读到的,但超过每分钟的某个阈值后它将停止工作。此外,你必须将它们发送给所有用户,而不仅仅是在线用户。可以发送静默通知,但仍不是最佳选择。
这就是为什么websocket是首选方式。此外,你可以使用类似于https://github.com/centrifugal/centrifugo的东西,它是你服务器的助手,将保存所有连接,并且非常稳定。

0

这不是二选一的问题,即使 Web-socket 也不是完全可靠的,但以上所有内容都应该考虑到,以进行有效的通信。当应用程序在前台时,使用 Web-socket 监听来自服务器的任何更新,并期望客户端通过 Socket 发送确认信息,如果 Web-socket 连接未激活或没有确认响应,则通过 APNS/FCM 传递更新。由于 APNS/FCM 不能保证传递,因此请在下一次 Socket 连接成功时再传递更新。


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