抖音互联网架构分析 | 青训营

124 阅读6分钟

系统组件组成

  • 客户端
  • CDN
  • 服务端
  • 数据库
  • 消息队列
  • 大数据处理平台

客户端

客户端是用户交互的入口,向后台请求视频的评论、内容和点赞信息等,也要将用户的上传保存到服务器中。
主要功能有:

  • 视频内容:推荐、关注、同城
  • 发布视频:剪辑、上传、管理
  • 社交:点赞、收藏、关注、评论、分享和私信等
  • 商城:购物相关,类似于淘宝

CDN

CDN是内容分发网络(Content Delivery Network)。作用是加速用户获取视频内容,降低服务器的负载,提升用户的体验,将一些静态资源部署在CDN上,根据用户请求分配合适的CDN节点。
减少资源的传输距离,提高了访问稳定性。

服务端

服务端负责处理用户的请求,与数据库进行交互,进行计算等。采用微服务架构,将系统拆分成多个独立的服务,每个服务都可以独立部署和拓展,同时采用分布式架构,将不同的服务部署在不同的服务器上,提高系统的可用性。

用户服务

处理用户的注册、登录、身份验证等功能。它还负责管理用户的资料、关注列表、粉丝列表等信息。用户服务使用MongoDB存储用户数据,使用Redis缓存用户信息,以提高数据的读取速度和系统的性能。

视频服务

负责处理视频上传、存储、转码、播放等功能。它使用七牛云存储作为视频存储服务,并使用Elastic Transcoder进行视频转码。视频服务还使用Redis缓存视频信息和相关数据,以提高视频的访问速度和系统的性能。

社交服务

负责处理用户之间的社交互动,如关注、点赞、评论、分享等功能。它使用MongoDB存储社交数据,使用Redis缓存社交信息和相关数据,以提高数据的读取速度和系统的性能。

推荐服务

使用机器学习算法和大数据分析技术,分析用户的行为和兴趣,为用户推荐相关的视频内容。它使用Elasticsearch作为搜索引擎,使用Spark进行数据分析和处理,使用Redis缓存推荐结果,以提高推荐的准确性和速度。

消息服务

负责处理系统通知、私信等消息功能。它使用Redis作为消息队列,使用MongoDB存储消息数据,使用WebSocket协议进行消息推送,以提高消息的实时性和可靠性。

监控服务

负责监控系统的运行状态、性能指标、错误日志等信息。它使用Elasticsearch作为日志存储和查询工具,使用Kibana进行日志分析和可视化,以提高系统的可维护性和调试效率。

以上这些服务通过API和消息队列进行通信,构成高拓展性、高性能的微服务架构。

数据库

采用了多种数据库,用于存储不同的数据。

MongoDB

一种文档数据库,用于存储用户数据、视频数据和社交数据等非结构化的数据。MongoDB的特点是高可用性、高性能和可拓展性,可以处理大量的非结构化数据。使用分片技术将数据分布在多个节点上,以提高读取和写入的性能。

Cassandra

一种分布式列存储数据库,用于存储日志数据、统计数据等大量结构化的数据。可以在多个节点上分布数据,提高读取和写入的性能,支持多种数据复制和一致性策略,提高数据的可靠性和一致性。

Redis

一种高速缓存数据库,用于缓存用户数据、视频数据和社交数据等常用数据。因为存储在内存中,所以特点是高性能和低延迟,可以快速的完成读写任务。支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,可以满足不同的应用场景。

消息队列

消息队列用于实现服务之间的异步通信和任务调度。
当用户上传一条视频,视频服务将视频信息写入到消息队列,推送给转码服务进行转码处理;当用户关注其他人时,社交服务将关注信息写入消息队列,推送给推荐服务进行分析,这种异步的通信方式能够降低服务之间的耦合度,使得系统的拓展性和维护性性得到提升。

大数据处理

对海量的用户数据进行处理和分析。
数据采集和存储:通过移动端和Web端的应用程序对用户数据和内容数据进行采集,包括行为、视频信息、评论、标签等。这些数据经过处理之后存储到分布式数据库中。
数据清洗:对于采集到的数据,可能出现重复、缺失、错误等问题,需要进行数据清洗和转换。使用Spark等大数据处理框架对数据进行清洗、过滤和转换,将数据转换成为可用的格式。
数据分析和挖掘:通过Spark等大数据框架对数据进行分析和挖掘,如用户画像、用户行为分析等。通过这些操作得到用户的兴趣爱好、视频的趋势等,用于优化推荐算法、推送广告和把握热点等。
数据可视化:使用Kibana等可视化工具,将分析结果可视化,方便管理人员和业务人员更好更快地了解数据趋势和变化。将结果更好地反馈到推荐系统、搜索系统、广告系统等的设计上,提高系统的命中率。

高并发应对方案

垂直拓展

通过增加单个服务器的处理能力提高系统性能。
增加服务器CPU、内存、硬盘等资源提高系统的处理能力,提升效果直接,但成本高且上限低。

水平拓展

通过增加服务器数量提高系统性能。
增加服务器数量分担请求和负载,需要考虑数据同步、负载均衡、容错等问题。

缓存优化

通过使用缓存减轻数据库压力。
使用Redis作为缓存,将经常访问的数据存储到缓存中,可以显著提高系统性能。

异步处理

将一些耗时的操作异步处理,减轻请求的压力,如用户上传视频时,将转码和存储等操作异步化,减轻上传请求的压力。

负载均衡

将请求分布到多个服务器上,平衡负载。例如使用Nginx等将请求分发到多个服务器上。