我正在编写一个通过Pusher使用WebSockets的应用。这是一个Ruby on Rails + AngularJS应用程序,但这应该适用于任何堆栈,真的。
我刚刚意识到我的应用并没有处理错过的推送事件,我很想知道一些已建立的模式是什么。
我的应用不是聊天,但让我们假装它。
当页面加载时,它会从数据库中获取最后100条聊天消息并显示它们。
每当有新的聊天消息进入时,服务器都会通过Pusher / WebSockets将新消息推送到客户端。
但是!如果客户端在推送时处于脱机状态或处于睡眠模式,则可能会错过消息。
处理这个问题的好方法是什么?
我有一些关于检测客户的模糊想法"醒来"并且要么强制整页重新加载,要么从某个时间戳或某个事件开始请求事件,但是我不知道什么是确定"唤醒"的好方法。不添加轮询到混合中。也许使用Pusher的client presence或connection states功能,检测用户何时(重新)连接?
我还没有找到一种方法来获取Pusher的事件历史,所以我想我必须自己存储这些事件,然后再将它们发回给该客户。
答案 0 :(得分:0)
您提到当页面加载时,您的客户端会从数据库中获取最后100条消息。由此,我了解到,除了通过Pusher推送消息之外,您还可以跟踪数据库中的所有消息。
因此,当您的客户端联机时,它应该检查首次访问该页面时通常会检查的相同端点。然后,您可以将返回的集与您在客户端上缓存的消息进行比较,看看是否遗漏了任何内容。
我对Pusher API不太熟悉,但在我看来,您可以倾听unavailable
或disconnected
事件。因此,当您看到这些事件时,只需设置一个标志,等待重新建立连接,然后再次从服务器中提取历史记录并与本地缓存进行比较。