读扩散、写扩散,主要应用在feed流场景中,什么是feed流?
- 微博
- 微信朋友圈
等都是典型的信息流业务,存在好友关系,如关注和粉丝,自己的主页由别人发布的内容组成。
feed流业务最大的特点是自己的主页由别人的feed组成,获得主页本质上就是在组装别人的内容。
从技术上主要有两种方式:
- 拉取(读扩散)
- 推送(写扩散)
拉模式(读扩散)
假设存在A关注BC,那么存储A关注B、A关注C;C的粉丝有A、B的粉丝有A,这么一组关系。
发布流程:当B/C发布内容时,只需将自己的内容存储在自己的队列(feed记录)中。
查询个人主页流程:当A查看自己的主页时:
- 拉取A的关注列表:存在B、C
- 获取所关注列表中B、C的feed记录,判断是否有可见性设置
- 对消息进行
order by time desc
,分页取数据
缺点
- 拉取信息流时,业务非常复杂
- 多次访问时,每次都需要进行大量计算
优点
- 存储结构简单,数据存储量较小,只存储一份不会冗余。
- 关注、取关、发布feed的流程都很简单
- 适合早期业务量不大的时候,可以快速实现
推模式(写扩散)
这是蓝色的文字
继续上面的假设,关注关系依旧不变,但与读扩散不同的是,每个用户还需要存储自己收到的feed流
发布流程:当B/C发布内容时,需要查询自己的粉丝列表,然后分别在粉丝A的feed中,写入B、C发布的feed信息。
查询个人主页的流程:当A查看自己的主页时:直接拉取自己的feed记录即可。
缺点
- 实现关注取关时,关注时,需要将信息从写入到粉丝的feed记录中,移除时,同样需要将内容从feed记录中删除。
- 极大的存储资源消耗,需要存储多份feed信息。
优点
- 拉取信息时非常简单,只需直接查询feed记录。
总结
- 拉模式,读扩散,feed存一份,存储小,用户集中访问数据,性能差;
- 推模式,写扩散,feed存多份,用冗余存储换锁冲突,性能高;
参考
全文参考自:58沈剑-读扩散,写扩散,终于讲清楚了!