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