开发者社区> 问答> 正文

智能云相册中多端增量照片同步的原理



数据获取方式


智能云相册按时间维度来管理数据,支持以类似Java中的迭代子模式来分批返回数据。
客户端在获取数据(比如获取照片、相簿、人脸、时光和标签列表等)时,需要提供以下几个参数:

  • Cursor:游标,其中包含有时间戳信息。初次获取数据,可以使用0来表示最小游标;使用当前时间戳(精确到毫秒)来表示最大的游标。
  • Direction: 获取数据的方向,可选值为forward,backward。当取值为forward时,获取比游标中的时间戳较新的数据。当取值为backward时获取比游标中的时间戳较老的数据
  • Size:表示本次请求最多返回多少条记录

智能云相册除返回业务数据以外,还会返回NextCursor。它的取值为:
  • 如果有数据返回,NextCursor为下次获取数据的基准游标,客户端可以使用这个游标继续获取数据。
  • 如果没有数据返回,NextCursor为EOF。

举例说明:
  • 用户在t0时刻开始上传第1-5这5张照片,t1时刻完成上传,
  • 在t2时刻上传了6-9这4张照片,在t3时刻完成上传。此时该用户总共9张照片。

从图中可以直观地看到,如果在t1-t2之间的某时刻获取数据时
  • 如果Direction为forward,将获取到比其更新的数据,也就是第6-9张照片;
  • 如果Direction为backward,将获取到比其更老的数据,也就是第1-5张照片。

具体来讲,客户端在获取这些照片时有以下几种方式:

从老数据开始全量获取



第一次请求:

  • 请求参数为Cursor = '0', Direction = 'forward', size = 5;
  • 响应:第1-5张照片,NextCursor = t1;


第二次请求

  • 请求参数Cursor = t1, Direction = 'forward', size = 5;
  • 响应:第6-9张照片,NextCursor = t3;


第三次请求

  • 请求参数Cursor = t3, Direction = 'forward', size = 5;
  • 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。
  • 注1:如果在第一次请求时指定的size=10,那么在第一次请求中就可以返回所有数据。
  • 注2:这里为了理解方便,将响应中的NextCursor设置为t1或者t3,不代表实际值就是t1或t3。


从新数据开始全量获取



第一次请求:

  • 请求参数为Cursor = '<当前时间戳>', Direction = 'backward', size = 5;
  • 响应:第5-9张照片,NextCursor = t1;


第二次请求

  • 请求参数Cursor = t1, Direction = 'backward', size = 5;
  • 响应:第1-4张照片,NextCursor = t0;


第三次请求

  • 请求参数Cursor = t0, Direction = 'backward', size = 5;
  • 响应:NextCursor = ‘EOF’;此时客户端可以停止获取数据了。


增量获取


增量获取主要用于不同客户端之间同步数据,比如自动将手机上拍摄的照片同步到平板电脑。增量获取数据时,客户端只需在获取数据后将服务端返回的NextCursor保存起来,下次同步数据的时候将其作为Cursor即可获取到更新的数据。
我们依然以上面的图为例,只是请求的时序有所不同:
  1. 客户端A在t0时刻上传了第1-5这5张照片

  2. 客户端B在t1-t2之间的某个时刻开始同步数据
    • 第一次请求:参数为Cursor = '0', Direction = 'forward', size = 5;返回第1-5条数据和NextCursor = t1;此时客户端需要将NextCursor的值t1保存下来。注:发送第一次请求时,客户端B本地没有缓存过的Cursor,所以它以0为Cursor开始发送请求。
    • 第二次请求:参数为Cursor = t1, Direction = 'forward', size = 5;无数据返回,NextCursor = EOF。此时,客户端不更改本地缓存的NextCursor值(依然为t1)。
  • 客户端A在t2时刻又上传了4张照片

  • 客户端B在t3时刻之后的某个时刻开始同步数据
    • 由于第2步中客户端B在本地记录了上次同步的Cursor = t1,故本次同步请求的参数为Cursor = t1, Direction = 'forward', size = 5,返回第6-9条数据。

  • 在这个例子中,第4步返回的都是新增的记录。在实际的场景中,客户端A也可能在t1-t2之间删除某些之前上传的照片。客户端B在同步数据时,服务端也会返回删除的记录,这样客户端B就可以在本地删除掉客户端A删除的那些记录。

    实现增量同步的关键点

    • 客户端从智能云相册服务端获取数据后,需要将数据缓存在本地。
    • 如果服务端返回的NextCursor不是EOF,则将NextCursor保存起来作为后续请求中的Cursor参数。
    • 客户端根据服务端返回的数据调整本地缓存,比如新增或者删除本地缓存中的记录。
    • 客户端在请求数据时,需要告知服务端它需要获取所有状态的记录。
    • 如果由于某些原因客户端本地的缓存被清理了,则需要拉取数据重建本地缓存。


    示例代码


    请参考利用SDK来实现 分批获取数据的示例代码。

    展开
    收起
    云栖大讲堂 2017-10-26 16:33:12 3036 0
    1 条回答
    写回答
    取消 提交回答
    • Re智能云相册中多端增量照片同步的原理
      有个问题请教下:
      当用户的B设备已经获取到了1,2,3,4,5到本地,此时用户的A设备在t2和t3中间,删除了照片3,下次B设备同步时,如何获取到这个“照片3删除”的动作?
      2018-11-05 11:05:57
      赞同 展开评论 打赏
    问答排行榜
    最热
    最新

    相关电子书

    更多
    微信 H5 视频播放器在海量业务下的实践 立即下载
    微信H5视频播放器在海量业务下的实践 立即下载
    微信广告引擎与播放节奏算法实践 立即下载