39 | 信息流设计(一):通用信息流系统的推模式要如何做?
唐扬
该思维导图由 AI 生成,仅供参考
你好,我是唐扬。
前两节课中,我带你探究了如何设计和实现互联网系统中一个常见模块——计数系统。它的业务逻辑其实非常简单,基本上最多只有三个接口,获取计数、增加计数和重置计数。所以我们在考虑方案的时候考察点也相对较少,基本上使用缓存就可以实现一个兼顾性能、可用性和鲁棒性的方案了。然而大型业务系统的逻辑会非常复杂,在方案设计时通常需要灵活运用多种技术,才能共同承担高并发大流量的冲击。那么接下来,我将带你了解如何设计社区系统中最为复杂、并发量也最高的信息流系统。这样,你可以从中体会怎么应用之前学习的组件了。
最早的信息流系统起源于微博,我们知道,微博是基于关注关系来实现内容分发的,也就是说,如果用户 A 关注了用户 B,那么用户 A 就需要在自己的信息流中,实时地看到用户 B 发布的最新内容,这是微博系统的基本逻辑,也是它能够让信息快速流通、快速传播的关键。 由于微博的信息流一般是按照时间倒序排列的,所以我们通常把信息流系统称为 TimeLine(时间线)。那么当我们设计一套信息流系统时需要考虑哪些点呢?
设计信息流系统的关注点有哪些
首先,我们需要关注延迟数据,也就是说,你关注的人发了微博信息之后,信息需要在短时间之内出现在你的信息流中。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了信息流系统中推模式的设计和实现。首先,作者强调了信息流系统的重要性和复杂性,以及在设计时需要考虑的关注点,如延迟数据、高并发访问和拉取性能。随后,详细解释了推模式的概念,即用户发布微博后,系统将该微博推送给其粉丝,实现微博的分发和信息流的聚合。作者还提出了推模式的具体实现方式,以及如何提升读取信息流的性能。文章还讨论了推模式存在的问题,如消息延迟、存储成本高和扩展性问题,并提出了解决思路。总的来说,本文深入浅出地介绍了信息流系统设计中的推模式思路,对于想要了解信息流系统设计的读者具有一定的参考价值。文章指出推模式适合粉丝数有限的场景,但对于像微博这样粉丝数庞大的业务,推模式存在难以接受的消息延迟和存储成本问题,因此需要考虑其他实现方案。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》,新⼈⾸单¥59
《高并发系统设计 40 问》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- 台风骆骆信息流的架构演化 1、一开始很简单,两张表,一张存储关注关系 ,一张存储微博消息,用户A发微博就是在相应的微博消息表中写入一条即可,用户B读微博也很简单,就是先得到自己关注的用户列表,然后定时去存储微博消息表中去读取自己关注的微博展示出来即可,优点是只有一份存储,缺点也很明显,对于这张表的读操作太多了,并发过大。 2、改成推模式,即写扩散机制,用户A发送一条消息,除了写入微博消息表以外,还要写入关注它的所有的用户的收件箱中(这个可以用redis来实现),然后用户去收件箱中读取消息即可,优点就是自己读自己的消息,跟别人没有竞争,缺点是多余存储,在大V用户发微博消息中有延迟,同时写入次数太多了,同时取消关注什么的也比较难操作。 3、后面改成了推拉结合的方式,即对于大V用拉模式,对于普通的用户继续用推模式。 4、后面出现了基于时间分区的拉模式,个人觉得可以结合推模式来进行相应的弥补。
作者回复: 👍
2019-12-2347 - tt我觉得推模式最大的问题是没有做到按需传递信息,可能一个粉丝的用户中,只有很少比例才需要较高的时效性,这些用户不应该消耗太多的系统资源。 此外,推模式中的写操作太多了,一个人发送,其他人在本质上都是读取这条消息,却也引发了写入操作。 应该把新的信息写入到若干存储(包括缓存上),然后选择适当的策论,让用户去这些存储上读取数据。这样可以大大降低写入操作的数量。
作者回复: 是的
2019-12-2328 - 追逐繁星的孩纸~老师,我有个疑问,我们是关注文档,使用推模式,新增和更新文档时,就查询有哪些用户关注了这篇文档,然后新增或者更新这些用户的收件箱。这样导致有个问题,一个是写入和更新操作比较多,另外一个是有重复消息或者消息乱序时,会重复更新用户动态或者把用户的动态更新为更早的。因为我们的关注用户量比较少,所以目前还能使用推模式。我想过使用缓存来缓存文档id和操作时间,每次新增或者更新动态时先比较下操作时间,但就需要加分布式锁。这种情况老师有什么建议么?
作者回复: 如果关注的人数不多,消息写入没有瓶颈的话,可以继续使用推模式。消息的乱序问题可以通过别的方式解决,比如如果使用Kafka,那么可以把一个人的消息写入到一个固定的partition
2020-01-217 - 正在减肥的胖籽。1.目前我公司的产品,我的做法没用数据库,全部是用redis来存储,用的就是推的模式。一个用户最多关注也就1万多个用户,当发了一条微博,就扔到消息队里面,消息队列再去拉取用户所有关注的人。一个一个放到对应粉丝的redis中。
作者回复: 只有一万的关注,这样做最简单了
2020-04-1024 - 胖胖程推的时候只给在线用户推一个未读消息数的提示,然后用户在点击未读消息的时候再去拉消息列表。推拉结合着用。
作者回复: 👍
2020-04-0824 - 知行合一推模式中可以给用户分优先级,优先推送优先级高的用户的方式来提升用户体验。
作者回复: 是的,推拉结合 是这样的
2019-12-234 - Jxin1.根据分组又建一张表。应该不存全量数据吧,太浪费空间。存与全局收件箱的id映射就好了吧。 2.这个推模式确实有点恐怖。大量写操作简直就是噩梦。硬刚实现这种大量写是不现实的。所以改成拉模式,在登陆时按需拉取。但全量的按需拉取,登陆时的信息同步延迟也是不能接受,所以推拉结合以及更细力度的操作,满满都是权衡。长见识。 3.拉可以批量可以压缩,其实优化的空间会大点。
作者回复: 一般收件箱都是记录ID,也就是对应关系,但即使这样,写入量依然很高
2019-12-282 - skyeinfo老师,对于信息流的缓存存储有什么比较好的建议呢?因为考虑到分页、过滤等筛选条件。
作者回复: 微博是只存储发件箱,并且是按照时间来分为多级缓存,比如把最近五天的微博ID存储到一组缓存里面,所以可以存储全量。 考虑过滤的话,也会存储一些用于过滤的flag信息
2019-12-2321 - Luciano李鑫不理解为什么基于推模式要给每个用户甚至每个分组存储一份完整的消息,为什么不能用存储关联关系,计算得到推送的消息呢?
作者回复: 是需要存储微博ID,不存储微博的内容,我不知道你提到的存储关联消息指的是不是这个
2019-12-231 - 海罗沃德跟微博比,我們的信息流弱爆了,目前都是用elasticsearch做信息流拉模式,閱讀之後就給當前頁的數據批量設置狀態,拉到下一頁就給下一頁數據更新狀態
作者回复: 存在即合理~
2019-12-2321
收起评论