文档章节

朋友圈设计

精通吹水
 精通吹水
发布于 2016/02/21 23:05
字数 1830
阅读 786
收藏 21

朋友圈设计

在社交软件中,朋友圈(社交圈)的功能逐渐出现在各个项目经理的案板上,本文将从技术的角度介绍,如何实现一个类似微信的朋友圈功能。

朋友圈的功能点

首先看看,朋友圈要实现的基本功能点,有请截图:

朋友圈截图

可以发现主要包含:

  1. 主题内容,具有各种类型的内容,如文本,图片,小视频,软文...

  2. 点赞信息,按照时间排序的用户信息

  3. 评论信息,按照时间排序的文本评论,或许以后会衍生出图片评论。

  4. 离线同步,不知道大家有没有发现,无论是发布主题,发布点赞,发布评论,都支持离线同步的功能。在断网的情况下,依旧可以进行发布说说。这个功能极大的优化了用户体验。

  5. 离线缓存,在断网的情况下,依旧能查看过去的说说内容。

  6. 增量更新,在使用朋友圈的过程中,对比同类型的APP,微信朋友圈的流量消耗是非常小的。

  7. 及时通知,包括了好友发表的说说显示小红点,他人回复的评论和点赞消息,都能及时的通知用户。

可以发现,这些4-7这些都是在之前QQ空间中没有发现的优点,加强了用户体验,以及适应移动环境下,低流量,网络不稳定的特点。

兼容性设计

可以发现,微信朋友圈在不断的升级过程中,不断引入了新的主题类型,而这主要是依赖良好的兼容性设计。具体可以参考App兼容性设计这篇文章。个人猜测就是使用TYPE字段进行向下兼容。

离线同步

离线同步的功能可谓是为移动环境量身定做的功能,极大的加强了用户体验。但是想要比较完美的实现这个功能,也是非常考验软件开发人员的。离线同步,基本实现的原理图:

离线同步过程图

其基本方法就是日志先行原则:把所有的操作,先写入本地数据库中,然后后台不断的进行同步到服务器。日志先行原则在分布式系统设计中,会经常被用到,它是分布式事务补偿(RETRY)的一种通用方法。

离线缓存

通过离线缓存,可以做到在断网的情况下,依旧可以查看朋友圈,并且,可以采用增量更新的方式,在刷朋友圈的时候进行低流量的同步服务器的说说到本地。

增量更新

增量更新通俗的讲就是把旧的数据和新的变化数据合并,形成最新的数据。

增量更新实现的两种方式:

  1. 采用日志版本号:则每次提交都会生成一个版本号,更新的时候,客户端拿着Old Version去服务器对比,服务器将Newest Version返回给客户端。然后进行for 循环升级即可。这种方式,比较适合需要追踪每次变化的业务场景,如SVN,GIT。

  2. 采用最后修改时间:对增量更新的目标,添加最后修改时间的属性(MT),客户端在更新的时候,拿着本地的MT和服务器的MT对比,然后判断目标是否需要更新即可。这种方式,就比较适合不需要追踪变化过程的场景,如朋友圈。但是需要注意,这个颗粒度需要选择合适。

增量更新的颗粒度:

颗粒度值得是增量更新的目标单位,比如说,一个文件,一个数据库,一条说说。选择合适的颗粒度是非常重要的。颗粒度太大会导致增量更新没有意义,太小会导致增量更新需要考虑的因素过多。 而在朋友圈中,选择颗粒度就是一条说说了。

要点设计

结合离线同步,离线缓存,以及增量更新中的各个要点,我们设计出如下的基本流程结构:

朋友圈基本设计

发布

在发布阶段,需要先把发布的内容(说说,点赞,评论)写入操作日志中,然后Notify SYNC 线程进行同步。

发布遇到的问题和解决方法:

  1. 发布-Request异常:只需要等待网络恢复正常,再次发布即可。

  2. 发布-Resonse异常:此时服务器已经写入了发布的具体内容,而APP端不知道,根据BASE思想,采用最终一致的方法,我们采用UUID作为内容的ID,只需要网络恢复正常的时候RETRY,服务器发现该ID的内容已经存在,则直接返回OK即可。

读取数据

而读取数据阶段,我们需要考虑合并日志和班级圈缓存,形成最终的数据。因为我们设计中,缓存数据就是合并了日志操作的缓存,所以只用直接读取就可以了。

刷朋友圈

在刷朋友圈的时候有两种情况:

  1. 获取最新的说说数据

  2. 获取某一条说说后面的固定条数的说说

此时,我们可以利用好离线缓存数据,提取离线缓存的ID+CT(创建时间)+MT(最后修改时间)进行查询,服务器进行查询后,如果发现服务器的MT时间大于APP的缓存,则返回增量更新的内容,且大致有三种状态:

  1. CREATE:APP端没有缓存中,本条数据,需要将本条说说完整的返回给APP,然后持久化
  2. UPDATE:本条说说具有更新,只需要返回点赞+评论列表+MT即可,因为主题部门基本上是不会变化的。然后更新MT时间。
  3. DELETE:本条说说已经被删除,APP端需要删除本条说说的缓存。

同步的时候,建议采用指示缓存数据信息数量=需要展示的数据数量+5 ,避免因为DELETE,从而导致服务器返回的数据(CREATE)中包含了APP端已经缓存的数据。

反穿

从服务器过来的数据,需要反穿过操作日志,才能形成正确的显示数据。反穿图解:

反穿图解

反穿的基本要求就是需要保证同步过来的数据和操作日志保持合并后,能保持最终一致。

推送

对于一些他人评论的消息,或者点赞信息,需要及时的推送给用户,所以我们还需要设计推送协议,将一些及时消息推送给用户。

总结

在移动环境中,网络异常和省流量是非常重要的,一个好的社交圈设计,需要考虑到这两点。而微信朋友圈无异于创造了先河。

© 著作权归作者所有

上一篇: Android crash 收集
下一篇: 通讯录设计
精通吹水
粉丝 18
博文 56
码字总数 55035
作品 0
人事招聘
私信 提问
加载中

评论(1)

精通吹水
精通吹水
不对之处,多多指教。
像“乱弹”的朋友圈设计

客户希望在原来apk的 IM 上,加上个类似朋友圈的东西; Android 用户可以 查看所有用户的朋友圈,或者好友的朋友圈;需要实现赞 ,评论,评论数显示; 目前我想到的: 表设计: 一张主表(含有...

smarthjx636
2015/06/02
342
2
2017年终总结,2018首次送书!

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 告别2017,迎来2018,小灰作为一名程序员,也作为一名耕耘在公众号平台上的作者,有必要对历史做一番总(装)结...

bjweimengshu
2018/01/03
0
0
想做一个广告的小平台,请大家说说思路吧

1.想做这个软件的原因是啥? 我现在居住在4线城市,由于这里没有人用什么招聘网站,所以一般发广告都是由一个加了很多人微信的人去发广告到朋友圈,号称是有5000人,如果想发广告,需要将图片...

双人鱼XKQ
2018/05/21
632
11
朋友圈不知你看到的那么简单,千万Feed流系统的存储技术解密

摘要:阿里巴巴高级技术专家木洛在2018云栖大会·深圳峰会中就Feed流的概念介绍、概念架构以及TableStore场景的Timeline模型等方面的内容做了深入的分析。本文带领大家一起了解并学习如何通过...

nirvanalucky
2018/05/14
0
0
一起撸个朋友圈吧 谈谈项目

项目地址:https://github.com/razerdp/FriendCircle (能弱弱的求个star或者fork么QAQ) 上篇链接:http://www.jianshu.com/p/17c51bd5ba70 下篇链接:暂停更新,恢复时间未定。 在发布这篇...

2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用阿里云镜像安装kubernetes

参考阿里云镜像 https://opsx.alibaba.com/mirror?lang=zh-CN 系统: CentOS / RHEL / Fedora cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https......

北漂的我
20分钟前
0
0
【HAVENT原创】前端使用 jsrsasign 进行 RSA 加密、解密、签名、验签

最近因项目需求,需要配合 JAVA 后端返回的签名,在 H5 网页中做验签功能。网上搜了一下发现了 jsrsasign 满足需求,所以顺便研究了一下 jsrsasign 。 首先去官网下载压缩包,解压后只需要引...

HAVENT
24分钟前
0
0
SpringMVC常见面试题总结【概念】

什么是Spring MVC?介绍你对SpringMVC的理解。 springmvc是一个基于java实现了mvc设计模式的轻量级web框架,通过把model,view,controller分离,将web层进行解耦,把复杂的web应用分成几部分...

薛小二
31分钟前
0
0
ucos 中断,调度,互斥 分析

实际场景: 首先有个标志位 pps_flag,是一个全局变量。有两个地方会用到这个变量,一个是pps信号触发的外部中断,一个是ucos的任务。当pps信号触发外部中断的时候pps_flag被置为2,当任务里面...

青春无极限
45分钟前
1
0
spark streaming、flink和storm区别浅析

1. 介绍 这三个计算框架常常被拿来比较。从我的角度来看,三者的比较可以分为两类(mini-batches vs. streaming)。spark streaming属于微批量的伪流式准实时计算框架(spark本身属于批处理框架...

xiaomin0322
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部