【问题标题】:Patterns for handling missed push events? E.g. chat messages sent while offline or in sleep mode处理错过的推送事件的模式?例如。离线或睡眠模式下发送的聊天消息
【发布时间】:2014-08-14 00:44:00
【问题描述】:

我正在编写一个通过Pusher 使用WebSockets 的应用程序。这是一个 Ruby on Rails + AngularJS 应用程序,但这应该适用于任何堆栈,真的。

我刚刚意识到我的应用不会处理错过的推送事件,我很想知道一些已建立的模式是什么。

我的应用不是聊天,但让我们假设它是。

  • 当页面加载时,它会从数据库中获取最后 100 条聊天消息并显示出来。

  • 每当有新的聊天消息进来时,服务器都会通过 Pusher/WebSockets 将新消息推送给客户端。

  • 但是!如果客户端在推送时处于离线状态或处于睡眠模式,他们可能会错过消息。

处理这个问题的好模式是什么?

关于检测客户端“唤醒”并强制重新加载整个页面或请求自某个时间戳或某个事件以来的事件,我有一些模糊的想法,但是我不确定什么是好的方法在不添加轮询的情况下确定“醒来”。也许使用 Pusher 的 client presenceconnection states 功能,检测用户何时(重新)连接?

我无法找到从 Pusher 获取事件历史记录的方法,所以我想我必须自己存储这些,然后仅将它们发送回该客户端。

【问题讨论】:

标签: angularjs websocket pusher


【解决方案1】:

您提到当页面加载时,您的客户端会从数据库中获取最后 100 条消息。据我了解,您除了通过 Pusher 推送消息外,还要跟踪数据库中的所有消息。

因此,当您的客户端上线时,它应该检查与第一次访问页面时通常检查的端点相同的端点。然后,您可以将返回的集合与您在客户端缓存的消息进行比较,看看您是否遗漏了什么。

我对 Pusher API 不太熟悉,但在我看来,您可以监听 unavailabledisconnected 事件。因此,您只需在看到这些事件时设置一个标志,等待重新建立连接,然后再次从服务器中提取历史记录并与本地缓存进行比较。

【讨论】:

  • 获取旧邮件的最安全时间是连接状态更改为connected 时。初始加载和重新连接时都是这种情况 (connected)。查看连接状态文档pusher.com/docs/client_api_guide/…
  • 它实际上并不检查端点——服务器将 JSON 数据呈现为一些内联 JavaScript,因此我们无需等待额外请求即可获得数据。但我当然可以添加这样的端点。我喜欢再次获取最后 100 条消息并找出您看到的消息的简单性。我会记住这个选项。谢谢!你也是,@leggetter。知道何时检查更新对我来说比如何获取更新更神秘:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
相关资源
最近更新 更多