今天几乎每个人都会使用多台设备,例如有手机,有ipad,也有pc,例如我们使用微信、使用钉钉、使用多闪等聊天软件进行聊天,或者使用各种购物软件,会发现数据在几个设备上都能同步显示,你在手机上进行聊天,在电脑上也会同步显示,在ipad上购买东西,在手机上也能查询到相关记录,有没有想过,这个是怎么实现的呢?多台设备之间是如何同步数据的呢?现在我们就来简单地讲讲这个问题。
推模型还是拉模型
推消息跟拉消息,首先我们先了解下什么是观察者模式,观察者模式,就是不同类不同系统之间,形成一定的依赖,单有一个类变更的时候,其他类就能感知到。简单地说,大家可以理解为订阅与关注,大家关注了沙茶敏,如果沙茶敏发布了一条动态,关注的人都能感知的到。而没关注的人,就不知道啦。观察者模式,又分了两种模型,分别是推送模型跟拉取模型。
推送模型,就是当被观察的人有新的数据的时候,就会向观察的人推送消息。举个简单的例子,例如沙茶敏写了一篇新的文章,里面查看他的粉丝列表,跟每一个粉丝说,我写了新文章了,已经放到你的消息列表里面了,可以查看了!
拉取模型,就是观察者每隔一段时间去跟被观察者询问,问他有没有新消息,如果有的话,就把消息拉取下来。例如粉丝每天都来询问沙茶敏,问他今天更新了没有,说了那么久的AI相关的分享也不更新!突然有一天发现他已经更新了,就把他的数据拉取下来。
至于什么时候采用推送模型,什么时候采用拉取模型呢?!大部分移动互联网场景采用的都是拉取的模型,定时去服务器那边询问服务器,我这个账号有没有新的数据。为什么呢,因为维护大量的用户在线状态是非常难的,需要消耗大量的资源,而且协议会非常复杂。
分页协议还是增量更新协议
常见的拉取协议又分两种,分别是分页协议跟增量更新协议。这两者又有什么不同呢?
分页拉取,就是客户端告诉服务器,我要第几页的数据,常见的应用场景有查询订单上面的购买记录,或者查询自己订阅记录之类的。这种常常是应用在客户端不保存服务器数据的场景,每次都直接跟服务器询问数据。
增量更新,每隔客户端都会询问告诉服务器,我这边的版本号是多少,服务器有没有数据更新,如果有的话,就下发给我。例如客户端A的数据版本是4,客户端B的数据版本是6,如果服务器的数据版本是8,他们都去服务器询问,服务器会给客户端A下发5,6,7,8而给客户端B下发7,8的数据。
我们再来回到一开始的问题,用户在多个客户端为什么能够保持数据是一致的呢?因为他们最终拉取的都是服务器的数据,客户端自己不会凭空捏造出其他数据出来。所有的数据,都必须是客户端有,如果某个设备断网了,产生了一些存在本地的临时数据,那么在其他客户端是看不到的。
那么为什么订单、订阅记录这种通常采用分页拉取协议,而聊天记录为什么却常采用增量更新协议呢?这是因为场景不一样!订单、记录这种,写场景会少很多,更多都是读的场景,所以每次都可以全量把数据读下来。而聊天这种,变更非常频繁,假设我们每秒拉取10条记录,那么如果存在有一秒有11条记录,岂不是就读取不到了,非常容易造成丢消息。而sync协议则没有这个问题,并且可以把数据保存在客户端,后面客户端可以直接使用本地的数据。
今天的介绍我们就讲到这里,如果你有兴趣,欢迎关注我,除了分享算法相关的,最近主要会讲一些redis的原理与应用。近期还准备了一些AI相关的知识,整理后会和大家继续分享。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)