正常在手机客户端发pyq,可以先暂时手机本地,保证自己快速刷到。然后通过异步将内容发到后台服务器。然后其他人刷pyq时从后台服务器加载数据即可。
问题是:异步传送视频/图片/文字可能需要较长时间,如果想几十秒就能刷到,怎么优化?
使用CDN:能够加速读取的服务器。 首先发pyq时异步发送到就近的CDN上,这步速度很快。然后,将图片/视频权限/内容等CDN地址发到pyq后台服务器,写入pyq的内容发布表。相册表记录发布表的索引,用于自己浏览pyq。- ⾸先你发送朋友圈的时候,⼀般是9张图⽚配合⼀些⽂字,组成了⼀条朋友前,⽂字还好说,但是图⽚就会稍微有点⼤了,也可以是⼀个短视频配合⼀些⽂字,点击发送,假设你要同步发送,可能会导致你点击发送按钮之后,弹出⼀个旋转框,告诉你发送中,持续好⼏秒种中,⽤户体验是⽐较差的。
- 有⼀个好⼀点的办法,可以把这些数据在客户端本地暂存⼀下,然后直接让你发送成功返回,⾛⼀个异步发送状态,然后⽴马让你⾃⼰在刷朋友圈的时候,可以把你客户端本地的刚发的朋友圈加载出来看到 。仅仅是这样,就会变成,发朋友圈成了你⾃⼰的⾃娱⾃乐,因为你的朋友圈并没有发送出去让你的好朋友看到。
- 可以⾛⼀个异步的模式,把你的朋友圈⾥的图⽚或者视频+⽂字,花费⼏秒钟的时间传送到你的后台服务器上去存储之后,你的朋友就可以从后台服务器上加载你的朋友圈⾥的图⽚和视频,可以看到了。你的那些视频和图⽚,是不是可以就都直接就近上传到CDN(content delivery network),不是直接到朋友圈系统的后台,这样速度是很快的;接着就是发送请求到朋友圈后端系统,请求包括图⽚的地址,你配的⽂字,发朋友圈的时候可以选择开放给谁看,这些数据写⼊到朋友圈发布表⾥去。然后需要在相册表⾥写⼊索引数据,⾥⾯存放的是对你的发布表⾥的数据引⽤,这样你以后浏览相册的时候,都是根据相册⾥的索引数据到发布表⾥找实际对应的数据的。接着就⾛⼀个离线批处理,通过批处理程序把这条朋友圈写⼊到你所有好友的时间线表⾥去,你好友的时间线表⾥就是存放了他刷朋友圈的时候,可以按照时间线刷到的所有好友的朋友圈。
- 你有3个好朋友,每个好朋友都在时间线表⾥有⼀个朋友圈的时间线,按照时间顺序排列了他可以查看的所有朋友圈,包括了他⾃⼰发的朋友圈以及他的好友发的朋友圈允许他看的那些,都会在这⾥。然后你的好朋友刷朋友圈的时候,就会知道⾃⼰的时间线表⾥有个新的变化,就是有好友发了朋友圈,此时就会提⽰你⼀个红⾊的圆点,你就开始刷,刷的时候就根据图⽚url地址,去cdn拉取的。
发送朋友圈的时候,可以通过⼏种⽅式进⾏谁可以看你这条朋友圈的权限的控制,你发的时候可以选择屏蔽谁,对哪个标签下的⼈开放。这条朋友圈的权限到了后台之后,会有⼀个离线批处理的程序跑起来,对最近发的⼀波朋友圈都找他们的朋友圈的权限的设置看⼀下,此时就会对你允许看到的好友,此时就在他们的时间线⾥插⼊这条朋友圈数据,那么这样的话,只有你允许的好友的时间线⾥才有你这条朋友圈。
⽐如说王五发的朋友圈16931 可以允许张三和李四看到,设置了⼀个标签组,标签名称是⽼铁三⼈组,⾥⾯就正好有张三和李四。张三 发表朋友圈的时间戳 朋友圈 16931 王五 张三 发表朋友圈的时间戳 朋友圈 16384 李四 李四 发表朋友圈的时间戳 朋友圈 16931 王五在redis ⾥可以设置张三的朋友圈是有变动的⼀个状态,在上次拉取朋友圈的时间点之后的⼀些朋友圈都从时间线表⾥拉取出来,刷朋友圈的时候,如果说你的⽹速要是不太好的话,你会发现这样⼀个场景:就是你最新的⼀些朋友发的朋友圈是显⽰出来了,但是视频和图⽚都是⼀⽚灰⾊,仅仅能看到他的⽂字和其他的⼀些东西,⽐如说点赞之类的,图⽚和视频死活看不到,都是⼀⽚灰⾊,反正我⾃⼰⽹速不好的时候经常看到这样的情况。 假设王五之前发了⼀条朋友圈,设置李四可以看到的,李四之前确实是看到了这条朋友圈的,但是有个问题,王五后来跟李四吵了⼀架,关系变得⾮常的不好,王五就对李四设置了⼀个朋友圈的权限,就是⾃⼰的朋友圈不允许李四看到,甚⾄可能会直接拉⿊/ 删除李四。这个好友,这个就够狠了 。你设置⾃⼰的朋友圈对所有朋友都是仅仅三天之内可见。就是说你跟李四之间的朋友圈的权限总设置或者是朋友之间的关系,有了变化,或者是你的⾃⼰的朋友圈对外展⽰的总权限有了变化,此时每次如果有变动,那么这些设置,包括你对每个朋友的朋友圈权限的设置,跟朋友的关系,⾃⼰的朋友圈的总权限,这些设置都会统统的缓存起来。 包括缓存在你⾃⼰的客户端本地,也可以缓存在你的朋友的客户端本地但是你可能随时会拉⿊、删除某个⼈,或者是突然设置对那个⼈朋友圈不可见,或者是突然你⾃⼰设置了朋友圈三天可见什么的,所以你设置的这些东西,都会被缓存起来,每次你好友刷朋友圈,查看⾃⼰的时间线表的时候,都会检查你的某条朋友圈根据你的⼀些⾏为,是否还对他可见。 李四会关注王五的各种朋友圈权限和朋友关系的⼀个变化,⼀旦说有变化了,可以缓存到⾃⼰的本地,下次在客户端⾥再次刷新朋友圈的时候,客户端对于王五的朋友圈会和王五的各种权限设置结合起来判断⼀下李四能否看到王五的这条朋友圈。 ⼀般那些操作很少做的,所以做的时候更新⼀下缓存就⾏了 。 3、如何设计⾼并发的朋友圈点赞系统架构?
我看到了你的朋友圈,此时我就可以对你的朋友圈去进⾏⼀个点赞,也可以取消点赞,假设要设计成⽀撑⾼并发的点赞系统,应该如何设计?
朋友圈的点赞和评论,是独⽴的数据,其实⽐如 点赞,都是可以基于redis来做的,每个朋友圈⾥对应⼀个set数据结构,⾥⾯放谁给你点赞了,这样每条朋友圈的点赞⼈和点赞数量直接从redis出就可以 了, smembers 和 scard评论也是可以存表⾥的,都是以朋友圈为粒度来存储。 那么刷朋友圈的时候,⽐如说你好友和你,另外⼀个好友都是好友,此时你好友刷到了你的朋友圈,就可以把另外⼀个好友对你的点赞和评论都拉出来,展⽰在客户端下⾯就可以了,这个展⽰过程可以是动态的。 你是王五,你的朋友圈被张三点赞了,李四跟你们也是好朋友,此时李四刷朋友圈看到了王五发的这条朋友圈,此时你可以在后台, 对这条朋友圈的set⽤张三做⼀个sismember操作,就是判断⼀下你们俩的所有共同好友,有哪些⼈对这条朋友圈点赞了。此时就可以看出来这条朋友圈被你们的共同好友多少⼈点赞了,哪些⼈点赞了 。 ⽐如你另外⼀个好友是否对友圈点赞了,直接sismember就可以判断出来,这样整个你基于 redis ,他都是⾮常⾼性能的。 4、红包系统架构设计 追前沿,领略SET化架构衍化与设计 - 简书 微信红包系统架构的设计和优化分享_emprere的博客-CSDN博客 https://zhuanlan.zhihu.com/p/288627366 微信红包系统架构的设计和优化分享_emprere的博客-CSDN博客 微信抢红包的方案_微信红包架构设计,高并发系统应用实战_野树长生的博客-CSDN博客 红包系统架构设计 - 知乎(二)微信红包高并发系统设计方案(1) - 简书
微信红包后台系统设计 - 云+社区 - 腾讯云 设想你负责⼀个系统,此时某个核⼼服务如果挂掉,该怎么处理? 如果你们公司的 Nginx 故障挂掉了,应该如何做才能保证他的⾼可⽤性? 如果让你来设计 12306 售票系统,应该如何设计? 如果让你来设计⼀个电商场景下的秒杀系统,应该如何设计?



