专栏名称: 架构师
架构师云集,三高架构(高可用、高性能、高稳定)、大数据、机器学习、Java架构、系统架构、大规模分布式架构、人工智能等的架构讨论交流,以及结合互联网技术的架构调整,大规模架构实战分享。欢迎有想法、乐于分享的架构师交流学习。
目录
相关文章推荐
小米汽车  ·  一些特殊的驾驶场景,#小米SU7Ultra# ... ·  昨天  
比亚迪汽车  ·  比亚迪皮卡BYD ... ·  3 天前  
比亚迪汽车  ·  比亚迪超级e平台,兆瓦闪充开启油电同速 ·  4 天前  
51好读  ›  专栏  ›  架构师

千万级关系链的Feed流系统架构设计

架构师  · 公众号  ·  · 2025-02-28 22:28

正文

架构师(JiaGouX)
我们都是架构师!
架构未来,你来不来?


面对千万级关系链与实时推送挑战,腾讯频道如何构建高性能Feeds流系统?本文深度解析三层架构设计策略,揭秘读写扩散混合方案与扩散量剪枝优化,破解超大社区场景下的空拉难题,为复杂社交产品架构提供实战经验。


背景


腾讯频道是一种基于爱好、话题或者因为现实中的某个组织,比如大学,将一群人聚集在一起,以帖子为内容载体,并辅以实时消息、音视频、直播、开黑、日程、机器人等能力的社区。



既然是以帖子为内容载体,那帖子系统如何实现则是频道的架构设计中重要的一环。



架构设计


2.1 业界对比


频道作为一个用户社区,同时也是一个 Feeds 流产品,和同为社区或者 Feeds 流的产品相比,复杂度都是非常高的。


QQ 群&朋友圈:和 QQ 群还有朋友圈相比,虽然都是实时的同步模式,和强关系链,但是 QQ 群和朋友圈关系链的规模都是千级别,而频道则是千万级别的超大关系链。


贴吧&微博&小红书:贴吧、微博、小红书相比,虽然都是同为超大规模的关系链,但是这三款产品是关注的弱关系,内容的同步方式更多的还是异步的,小红书核心场景都是基于推荐和搜索,微博和贴吧则是关系和推荐都有,而频道则是基于超大关系链的带有实时推送的内容流。


同时频道相比于其他产品有更加复杂的功能和权限,综上所述频道在所有维度都有更高的复杂度,而这些对于 Feeds 流都有着直接的关联影响。


2.2 整体架构设计

2.2.1 功能介绍


频道的内容功能非常多,常规的所有的能力如帖子、评论、回复等等都有,除此之外,还有非常繁杂的 Feeds 流。

  • 子频道帖子列表:单频道内单个子频道的帖子列表,包括按照发表时间&互动时间两条内容流。

  • 帖子广场:单频道内所有子频道的帖子聚合列表,同样包括最新发表,最新回复两条流。

  • 个人动态:单用户加入的所有频道的所有子频道的帖子聚合列表,按发表时间排序。

  • 发现页:基于推荐设计的全局内容流。

  • 话题帖子列表:所有发表带有某个话题的内容流,支持两条排序流。


其他我发表的、我点赞的、我浏览的帖子列表则是字面意思,不一一展开介绍。


除此之外还有帖子的评论列表,评论的回复列表,个人的互动消息列表等等也不一一展开。


2.2.2 架构设计

那这么多复杂的功能,我们应该如何设计呢?


我们不要被这么多的功能吓到,所有功能的底层逻辑都是相通的,只要我们遵从后台的设计理念分而治之,再多的功能都能轻松厘清。


以下是一个极简版的频道 Feeds 系统的结构图:



整体遵从3个原则:


  • 三层架构:分为逻辑层、存储代理层和存储层。

    • 逻辑层:负责数据的组装和逻辑的处理。

    • 代理层:屏蔽存储层,对外提供统一的原子接口,或者聚合接口。

    • 存储层:负责存储帖子、评论等内容的索引和数据。

  • 轻重分离:核心接口和非核心接口隔离,避免互相干扰和影响,同时减少发布观察的成本。

    • 核心接口:独立服务,避免干扰。

    • 非核心接口:可适当将多个接口合并成一个服务,减少服务数量的同时减少机器成本和维护成本。

  • 读写分离:读接口往往请求量高,风险低,变更频繁,而写接口则恰恰相反,请求量低,风险高,变更较少。

    • 逻辑层:读接口和写接口独立服务,独立部署,减少互相干扰,减少维护成本。

    • 存储层:社交产品大部分场景对读的实时性没有极致的要求,保证最终一致性就好,写主库,读从库,可以充分利用存储的资源,减少存储成本。


大多数的功能只要遵循这3个原则,基本都能比较容易的拆解和实现。


2.2.3 Feeds 流设计

2.2.3.1 方案选型

频道作为一个 Feeds 流社区,Feeds 流必然是其最关键的设计,Feeds 流作为业界相对比较常见的产品,无论是国内还是国外都有比较多的同类产品,方案也都相对比较明确,那么频道和这些产品相比有什么不同吗?


以下业界产品普遍的最简单的映射单元:



这是一种基于关注关系的 Feeds 流,如微博和小红书的关注列表,内容生产者发表内容,一群内容消费者关注内容生产者消费内容,同时每个消费者还会关注若干个生产者。


以下是频道的最简单的映射单元:



从对比中很明显可以看出频道是一种多层级的映射关系,生产者发表内容在各个子频道内,而子频道又归属不同的频道,子频道还有复杂的权限限制,消费者通过加入或者浏览这些频道来消费内容。频道明显更加复杂,业界方案肯定是没有办法直接搬过来用的,那我们应该如何设计呢?


2.2.3.2 方案设计

虽然上面说是最小的映射单元了,但是只是为了和业界其他产品在同一个维度上进行对比,实际上还有进一步简化的空间。


1)子频道帖子列表


先复杂到简单:先把复杂的映射关系进一步简化,我们就能得到如下模型。



这就是频道内某个子频道下帖子列表的模型,和业界其他的模型就基本一致了,我们就可以选择业界比较常见的读扩散或者写扩散简单的实现。实现方式如下:



这里我们选择写扩散(或者也可以不叫扩散),简单的实现了频道下 C1、C2、C3 三个子频道帖子列表,其中 C1 为私密子频道,仅部分用户可见。


2)帖子广场


再简单到复杂:实现了简单的模型后,再在简单模型的基础上慢慢复杂化,实现更加复杂的帖子列表。


我们已经实现了子频道帖子列表了,下一步单个频道下的帖子广场(前文有介绍帖子广场是什么)应该如何设计?依然是先设计模型:



模型进一步复杂后依然还是三层映射,这里我们选择同子频道帖子列表通过读扩散的方式聚合实现:








请到「今天看啥」查看全文