微信亿级朋友圈的社交系统设计
先来说一下业务需求吧:
- 每个用户可以发朋友圈,可以点赞,评论
- 可以设置权限,不看某些人朋友圈、不让某些人看你的朋友圈
- 可以刷朋友圈中其他人的动态
对于这样的系统设计,主要从业务来考虑如何设计,比如不能让用户等太久,那么从哪些方面可以优化速度,这些思想在所有的系统设计中都是
通用
的
发送朋友圈的流程
一般发送朋友圈是一段文字 + 几张图片或者视频,那么如果视频和图片较大,上传是比较慢的,如果等上传到服务器之后再返回用户成功,那用户可能要等 2-3 秒,界面一直在转圈,用户肯定会感到很难受哈
因此点击发送朋友圈的操作,要设计成异步的,点击发送之后,先将数据保存在本地缓存里,再通过异步操作将数据上传服务器,保存在本地成功后,就可以返回用户发布成功了,再异步的向服务器上传即可
那么如果不保存在本地,也可以将视频和图片就近上传到 CDN 中(当然也可以先保存在本地,再上传到 CDN 中),传到 CDN 的话也是很快的,之后再将发送请求到服务端,包括图片的 CDN 地址、视频的 CDN 地址、文字内容,并且将朋友圈的权限给写到朋友圈的发布表中去
之后,再通过离线的批处理(后台处理)将你刚刚发布的朋友圈给写入到好友的时间线表中,让好友也可以刷到你发布的朋友圈
那么还有朋友圈的权限设置,比如不让某人看,或者不看某些人,这些权限肯定是要缓存在本地的,而且权限的数据符合写少读多的特性的,用缓存来做很合适,如果你的好友的朋友圈权限设置发生了变化,那么可以发送一个通知,将你和好友的本地缓存都更新成新的数据
那么每次你刷新朋友圈,会根据你和好友的朋友圈的权限结合起来进行判断,看你是否有权限看到这条朋友圈
高并发的朋友圈点赞系统架构
点赞功能:可以点赞,可以取消点赞
基于 Redis 来设计点赞系统就可以,微信的朋友圈点赞和评论只有好友之间才可以看到的
每个朋友圈动态都在 Redis 中通过 set 集合来存放谁来给你点赞了,这样点赞的人和数量都可以从 redis 中直接获取,使用 smembers 和 scard 命令
那么你的朋友圈被 A 点赞了,B和你俩也是好朋友,那么 B 刷到你的朋友圈时,对你和 B 的共同好友通过 sismember A
来判断 A 是否给这条朋友圈点赞了,将共同好友的点赞给展示出来
对于评论的话,存在表中,也是将共同好友的评论给展示出来即可
如果是重复点赞其实也没有关系,在 Redis 的 set 中本来就会去重,因此不会出现重复点赞的情况