李智慧 · 高并发架构实战课
李智慧
同程艺龙交通首席架构师,前 Intel & 阿里架构师,《大型网站技术架构》作者
23286 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
李智慧 · 高并发架构实战课
15
15
1.0x
00:00/00:00
登录|注册

13 | 微博系统设计:怎么应对热点事件的突发访问压力?

网络带宽
QPS
多媒体文件
文本内容
分布式缓存
反向代理
CDN
微博ID分片
用户ID分片
本地缓存模式
时间淘汰算法
推拉结合模式
拉模式
推模式
Post请求处理
Get请求处理
访问并发量
存储空间
刷微博
关注好友
发微博
面对高并发访问压力的优化方案
缓存方案
推拉结合模式
微博作为信息流应用产品
数据库分片策略
缓存使用策略
微博的发表/订阅问题
部署模型
解决高并发问题
性能指标
核心功能
思考题
小结
详细设计
概要设计
需求分析
Weitter 微博系统设计

该思维导图由 AI 生成,仅供参考

你好,我是李智慧。
微博(microblog)是一种允许用户即时更新简短文本(比如 140 个字符),并可以公开发布的微型博客形式。今天我们就来开发一个面向全球用户、可以支持 10 亿级用户体量的微博系统,系统名称为“Weitter”。
我们知道,微博有一个重要特点就是部分明星大 V 拥有大量的粉丝。如果明星们发布一条比较有话题性的个人花边新闻,比如宣布结婚或者离婚,就会引起粉丝们大量的转发和评论,进而引起更大规模的用户阅读和传播。
这种突发的单一热点事件导致的高并发访问会给系统带来极大的负载压力,处理不当甚至会导致系统崩溃。而这种崩溃又会成为事件热点的一部分,进而引来更多的围观和传播。
因此,Weitter 的技术挑战,一方面是微博这样类似的信息流系统架构是如何设计的,另一方面就是如何解决大 V 们的热点消息产生的突发高并发访问压力,保障系统的可用性。今天我们就来看看这样的系统架构该怎么设计。

需求分析

Weitter 的核心功能只有三个:发微博,关注好友,刷微博。
发微博:用户可以发表微博,内容包含不超过 140 个字的文本,可以包含图片和视频。
关注好友:用户可以关注其他用户。
刷微博:用户打开自己的微博主页,主页显示用户关注的好友最近发表的微博;用户向下滑动页面(或者点刷新按钮),主页将更新关注好友的最新微博,且最新的微博显示在最上方;主页一次显示 20 条微博,当用户滑动到主页底部后,继续向上滑动,会按照时间顺序,显示当前页面后续的 20 条微博。
此外,用户还可以收藏、转发、评论微博。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

微博系统设计面临热点事件的突发访问压力,本文提出了针对10亿级用户体量的微博系统“Weitter”架构设计。文章首先分析了Weitter的核心功能和性能指标估算,包括存储空间需求和访问并发量。在概要设计中,系统架构主要解决高并发问题,包括Get请求和Post请求的处理流程,利用CDN缓存、反向代理服务器、分布式文件存储集群、Redis缓存服务器和MySQL分片数据库等组件来处理读写请求。详细设计则重点讨论了如何快速响应用户请求和避免数据库负载压力。整体设计思路清晰,针对性强,为应对微博系统的高并发访问压力提供了有力的技术支持。 文章还介绍了微博的发表/订阅问题,提出了推模式和拉模式的解决方案,并探讨了缓存使用策略和数据库分片策略。通过时间淘汰算法和本地缓存策略,Weitter有效地提高了系统性能和吞吐能力。最终,文章指出微博系统的架构设计思路对信息流应用产品具有普适性,为读者提供了对信息流产品架构的深入了解。 总体而言,本文深入剖析了Weitter微博系统的架构设计,为读者呈现了高并发访问压力下的系统优化方案,对于从事信息流应用产品开发和架构设计的技术人员具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《李智慧 · 高并发架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • ABC
    在gitee上有一个jd-hotkey的项目,实现了热点数据推送至集群本地的功能,性能强悍。微博也可以用这种方式实现本地缓存。

    作者回复: 赞。这个方案应该可以解决前面同学 @猿人谷 提到的缓存一致性问题。

    2022-04-01
    12
  • neohope
    优化方面: 1、通过AI自动识别热点话题,识别地域性热点话题,热点话题加入服务端缓存 2、通过热点话题趋势预测,架构自动扩缩容 3、扛不住的时候,服务自动降级或熔断 4、跨区域多数据中心,就近访问 5、硬件方面,可以使用SSD,缓存新的非热点数据,替代内存,降低成本 功能方面: 1、热点话题管理 2、评论及转发管理 3、微博检索功能 4、微博合规性管理,包括屏蔽、删除功能 5、微博机器人识别

    作者回复: 赞

    2022-05-03
    4
  • 贯通
    用户 ID 分片带来的热点问题,可以通过优化缓存来改善;--老师可以再详细些么

    作者回复: 给带来热点的大V们更多的缓存,比如百万以上粉丝的大V缓存所有历史微博数据,这样就根本不会访问数据库,也就没有热点压力。

    2022-03-20
    2
    4
  • killer
    1.推拉模式纬度是针对粉丝查询好友发布微博构造的列表,用户如果在线采用推方式构建一个列表,用户不在线,上线后分别拉好友消息构造列表,这里有一个疑问,上线后不是用推方式吗?如果是好友发表微博再用推的方式,那么怎么保证拉的方式和推的方式平滑过度呢?2.后面有一个缓存七天微博数据是按照用户id和发表微博的id进行缓存的,纬度是针对发表者来做的缓存。所以对粉丝刷新列表并没有命中缓存呢?这两个纬度不同解决的应该是不同的问题呢?3.最后一问题是回复Geek的问题,七天内数据缓存起来不需要每个用户拉20条,如果要实现这个不是应该按照用户id缓存所有好友的微博吗?如果是这样,大v发表一篇微博要进行所有粉丝id和微博id的缓存吗?不知道我有没有理解错误

    作者回复: 1 用户上线后,先建立一个空的初始列表,如果这个时候好友发微博,就推到这个空的初始列表。然后用拉的方式构建一个拉列表,把拉列表内容接在前面的初始列表上。接的时候检查初始列表的内容是否在拉列表里,在的话,删除重复内容。 2 刷新微博就是按时间维度构建列表内容的,所以按照时间维度缓存,缓存不命中,说明关注的好友最近7天都不发微博,不活跃,大概率说明该用户自身也不活跃,符合缓存的设计目标。

    2022-03-19
    4
  • 猿人谷
    对于特别热门的微博内容,启用本地缓存模式后,保证一致性(本地缓存、分布式缓存、数据库),大佬是用的哪种方案?

    作者回复: 微博不能修改,只需要处理删除的情况就可以。 分布式缓存在用户删微博的时候直接删除即可,本地缓存采用过期失效,过期失效时间2分钟。过期失效会导致明星删除微博后,失效到期前还能刷出微博内容,但这是运营方可以接受的,甚至是期望的。

    2022-03-22
    2
    2
  • peter
    请教老师几个问题啊: Q1:反向代理和负载均衡都用Nginx吗? 文中有反向代理和负载均衡两个功能实体,它们是分别用一个组件来实现吗?比如用A来完成反向代理,用B来实现负载均衡。 Nginx既可以做反向代理,又可以做负载均衡,所以,会采用Nginx来完成这两项功能吗? Q2:用什么实现分布式文件系统?FastDFS?HDFS? Q3:用什么表示“最新微博”?时间吗?还是设置一个标记? Q4:新浪微博用了AI吗? Q5:微博的信息会一直存吗? 比如新浪微博,每一年都会有大量的消息需要存储。二十年后数据会积累很多。这些数据会一直保存吗?会根据一定策略删除老数据吗?

    作者回复: 1 不是,我们这个设计里,反向代理用nginx,负载均衡用lvs。也有反向代理和负载均衡都用nginx的,这种一般系统规模比较小,反向代理同时承担负载均衡的职责,画在架构图里,只画一个组件。 2 这里存储的是图片小文件,HDFS不合适,FastDFS或者Ceph都可以。 3 用,所有有广告推荐的都有AI。 4 Witter会存储,存储的成本是逐年下降的,数据很重要。新浪微博会不会存储看用户协议。

    2022-03-18
    2
  • 👽
    我觉得这篇专栏,高并发的设计已经相对比较全了:消息队列,缓存。 如果问我还有什么地方可以进一步优化的话,我觉得可以考虑的点: 1. 多地部署,就近访问。就近地区的用户请求,尽可能就近处理。同时,用户的相关信息是否可以就近访问,优先访问同一个数据中心的数据,然后再进行跨地域访问。个人理解,微博有一定地域性。比如,南方地区的人,是不是关注南方地区的博主就会多一些。东北,西北,以及国外,同理。(当然,这一点的可行性还没有深入分析,只是初步想法)。 2. 进一步深度定制。据我查询资料的结果来看的话呢,新浪微博的Redis组件和硬件搭配是经过定制的。Redis对于热点信息的存取做了优化,硬件方面使用SSD对于高频读写的数据做存储。 3. 就是通用类型的高可用保障,多地多可用区多副本的集群部署,个人认为,这个也可以结合数据优先就近访问。

    作者回复: 赞,新浪微博在很早的时候就部署了北京、上海、广州三个数据中心。

    2022-03-18
    1
  • 阿棠
    “缓存的 key 为用户 ID,value 为用户最近 7 天发表的微博 ID 列表。” 这应该怎么实现? 如果定时任务为每个用户更新最近7天发表的微博ID,更新时的读写压力又太大了。

    作者回复: 缓存更新是用户在发布微博的时候触发的,不需要定时任务。

    2023-12-07归属地:广东
  • 冷杉
    请问一下李老师,您文稿中的图片用的是什么软件画的呀?

    作者回复: 亿图

    2022-08-29归属地:北京
  • Li Yao
    如果一个大V有1000万粉丝,其中有100万粉丝在线,当大V发微博时,会触发给100万人的缓存中新增数据吗?

    作者回复: 是的

    2022-07-01
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部