阿里P7面试被问到亿级聊天架构如何用Netty设计,感觉凉了

IM系统里经常会涉及到读扩散和写扩散这两个技术概念,我们来看看。

读扩散

读扩散也称为“拉模式”,这应该是最符合我们认知直觉的一种技术实现方式。

原理如下图:

**如上图所示:**每一个内容发布者都有一个自己的发件箱(“我发布的内容”),每当我们发出一个新帖子,都存入自己的发件箱中。当我们的粉丝来阅读时,系统首先需要拿到粉丝关注的所有人,然后遍历所有发布者的发件箱,取出他们所发布的帖子,然后依据发布时间排序,展示给阅读者。

**这种设计:**阅读者读一次消息流,后台会扩散为N次读操作(N等于关注的人数)以及一次聚合操作,因此称为读扩散。每次读消息流相当于去关注者的收件箱主动拉取帖子,因此也得名——拉模式。

这种模式:

1)**好处是:**底层存储简单,没有空间浪费。

2)**坏处是:**每次读操作会非常重,操作非常多。

**设想一下:**如果我关注的人数非常多,遍历一遍我所关注的所有人,并且再聚合一下,这个系统开销会非常大,时延上可能达到无法忍受的地步。

**因此:**读扩散主要适用系统中阅读者关注的人没那么多,并且刷消息流并不频繁的场景。

**拉模式还有一个比较大的缺点:**就是分页不方便,我们刷微博或朋友圈,肯定是随着大拇指在屏幕不断划动,内容一页一页的从后台拉取。如果不做其他优化,只采用实时聚合的方式,下滑到比较靠后的页码时会非常麻烦。

写扩散

**据统计:**大多数消息流产品的读写比大概在100:1,也就是说大部分情况都是刷消息流看别人发的朋友圈和微博,只有很少情况是自己亲自发一条朋友圈或微博给别人看。

**因此:**读扩散那种很重的读逻辑并不适合大多数场景。

我们宁愿让发帖的过程复杂一些,也不愿影响用户读消息流的体验,因此稍微改造一下前面方案就有了写扩散。写扩散也称为“推模式”,这种模式会对拉模式的一些缺点做改进。

原理如下图:

**如上图所示:**系统中每个用户除了有发件箱,也会有自己的收件箱。当发布者发表一篇帖子的时候,除了往自己发件箱记录一下之外,还会遍历发布者的所有粉丝,往这些粉丝的收件箱也投放一份相同内容。这样阅读者来读消息流时,直接从自己的收件箱读取即可。

这种设计:每次发表帖子,都会扩散为M次写操作(M等于自己的粉丝数),因此成为写扩散。每篇帖子都会主动推送到所有粉丝的收件箱,因此也得名推模式

**这种模式可想而知:**发一篇帖子,背后会涉及到很多次的写操作。通常为了发帖人的用户体验,当发布的帖子写到自己发件箱时,就可以返回发布成功。后台另外起一个异步任务,不慌不忙地往粉丝收件箱投递帖子即可。

写扩散的好处在于通过数据冗余(一篇帖子会被存储M份副本),提升了阅读者的用户体验。通常适当的数据冗余不是什么问题,但是到了微博明星这里,完全行不通。比如目前微博粉丝量Top2的谢娜与何炅,两个人微博粉丝过亿。

**设想一下:**如果单纯采用推模式,那每次谢娜何炅发一条微博,微博后台都要地震一次。一篇微博导致后台上亿次写操作,这显然是不可行的。

**另外:**由于写扩散是异步操作,写得太慢会导致帖子发出去半天,有些粉丝依然没能看见,这种体验也不太好。

通常写扩散适用于好友量不大的情况,比如微信朋友圈正是写扩散模式。每一名微信用户的好友上限为5000人,也就是说你发一条朋友圈最多也就扩散到5000次写操作,如果异步任务性能好一些,完全没有问题。

那对于上面说的超级大V到底是采用读扩散还是写扩散了,其实都不是,在业界还有另一种读写混合模式。

亿级架构核心点

由于概念比较多,一篇文章是不可能全部描述清楚的,还有像钉钉、微信与微博这种亿级海量用户的系统架构实现其实有很多难点,随便给你说几个,看下你自己是否知道!

1、亿级用户同时在线聊天如何保证高并发聊天消息正常推送

2、公众号千万级粉丝大V发文章如何让粉丝高效收取

3、高并发聊天系统如何保证发送的消息不乱序

4、微信钉钉后端海量离线消息如何高效存储与获取

5、高并发聊天系统如何保证发送的消息不丢失

6、单聊与群聊数据收发机制用读扩散还是写扩散

7、如何设计微博上亿粉丝大V消息收发架构

8、微信后端PB级海量历史聊天消息数据如何存储

9、应该如何架构微信春晚抢红包高并发系统

10、微信钉钉后端如何保证消息收发核心链路高可用

11、微信钉钉的群聊为什么要设置人数上限

12、如何架构微信后端百万在线直播互动系统

13、如何设计微信钉钉后端系统的缓存架构抗高并发

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-Nb2I7GVt-1714818547143)]

[外链图片转存中…(img-IRZYlQga-1714818547143)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值